使用保留字作为属性名称,重新审视

IT技术 javascript json properties javascript-objects reserved-words
2021-03-09 16:42:36

保留字可以用作对象的属性名称吗?

这个问题是在之前的 Stack Overflow 问题中间接提出的:Browser support for using a reserved word as a property name in JavaScript答案似乎是Alex Wayne 的普遍共识

您可以使用这些词,但只能用作字符串而不是速记属性。

foo['class']; // cool
foo.class;    // not cool

虽然我认为他们在这方面可能比我更了解,并且在某些情况下使用保留字可能是一个坏主意,但我认为他们的结论基于两点是错误的:

  • 使用它们作为“速记”属性测试保留字

  • HTMLFormElement 使得在“速记”中使用保留字成为可能

首先,使用保留字列表,每个都作为属性添加到Objectand 中HTMLElement,都作为obj["word"]and obj.word,然后作为obj["word"]and检索obj.word在 63 个案例中的每一个案例中,所有八项测试都正常工作。

其次,HTMLFormElement 需要这样做,因为它使用速记符号检索其元素。如果<input name='typeof' value='scalar' />是表单元素,则form.typeof==“标量”。

根据我的经验,保留字通常是数据造成的(例如名为“private”的列),而不是程序造成的。因此,它们会污染 JSON 对象,并从那里污染输入,并从那里污染 HTMLFormElement。简而言之,如果没有大量(恕我直言不必要的)工作,就不可能保持保留字被强制在速记中正确工作。

在我看来,这些真正的问题是:

  • 需要注意不要与现有属性发生冲突,而不是保留字

  • (许多如果不是全部)变量不能是保留字

  • 使用保留字作为属性可能(但不一定)令人困惑

那么这个结论是否正确,保留字作为属性名称,并作为字符串或速记访问它们,就可以了 - 只要对这种情况应用一点常识?

4个回答

在 ECMAScript 中,从 ES5 开始,保留字可以用作“buff”中的对象属性名称。这意味着在定义对象字面量时不需要用引号“包裹”它们,并且可以在对象上取消引用(用于访问、分配和删除),而不必使用方括号索引符号。

也就是说,保留字仍然不能用作标识符名称。这在规范中非常明确地说明,并且在这里有些强调(如果您不想因为不得不阅读实际的语言规范而流血)......

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Reserved_Words

以下是关键字,不能用作变量、函数、方法或对象标识符,因为 ECMAScript 为它们指定了特殊的行为:

有一个奇怪的错误,我正在计算字符串中关键字的实例,并且正在测试第一次出现if (typeof key [token]==="undefined")...- 对“函数”构造函数的误报。最终使用了两个数组,一个用于键,一个用于值,这在其他方面满足了我的需求。(保存稍后调用 Object.keys)
2021-04-16 16:42:36
那么,我们如何缩小像 bootstrap_multiselect.js 这样使用 $tag = $('<option/>').attr({ value: option.value, label: option.label || option.value, title: option.title, class: option.class, selected: !!option.selected, disabled: !!option.disabled });
2021-04-22 16:42:36
ReservedWordIdentifierName的枚举子集。句法语法将Identifier定义IdentifierName,而不是ReservedWord ”。清如泥。来源
2021-05-06 16:42:36
* 保留字仍不能用作标识符名称*你的意思是标识符因为从我在此处和链接页面上阅读的内容来看,它们似乎可以用作标识符名称 (IdentifierNames) 而不是标识符。
2021-05-07 16:42:36

我不太确定你想表达什么,所以我能给出的唯一答案是:是的,可以使用保留字作为属性名称。

(但是有两个小说明:foo["class"]可以,不是foo[class]。以及您应该使用的任何方式, form.elements["xyz"]而不是form.xyz访问名为 的元素xyz。)

为什么要使用foo["xyz"]over foo.xyz我认为没有理由偏爱其中一个。第一个只是增加了很多噪音,只有在您使用保留字或变量作为键时才有用。
2021-04-22 16:42:36
绝对同意使用form.elements['abc']而不是form.abc- 但重点是 JavaScript 浏览器form.abc根据定义支持修正了上面的错字。通过谷歌和质量,stackoverflow 正在成为备受推崇的参考。当我引用时,没有意义,所以“试图澄清事实” - 并认为我可能是错的。
2021-05-03 16:42:36
@cdmckay 我没这么说。
2021-05-13 16:42:36
当脚本抛出 JavaException 时,Mozilla Rhino JavaScript 引擎的非 JSR223 实现会执行此操作。如果您需要做特殊的逻辑来处理它,您需要检查exception.javaException["class"].name它是否与您要查找的特定异常的 Java 类名匹配。
2021-05-14 16:42:36

是的,它可以使用。

小小说明,如果您使用 YUI 压缩器,则必须将属性名称与 js 保留字之一放在引号中。

例如,这不会压缩

var a = { case : "foo"}; // syntax error, "invalid property id"
a.for = "bar"; // syntax error, "missing name after . operator"

这会做

var a = { "case" : "foo"}; //OK
a["for"] = "bar"; //OK

这是使用 YUI Compressor 的在线 JavaScript/CSS 压缩,可以在其中进行测试。

是的,在大多数浏览器中(包括 IE9+)

Kangax 兼容性表中实际上有一个条目“保留词作为属性名称”

http://kangax.github.io/compat-table/es5/#test-Object/array_literal_extensions_Reserved_words_as_property_names