使用保留字作为属性名称,重新访问

时间:2011-08-11 07:36:49

标签: javascript json properties javascript-objects reserved-words

reserved word可以用作对象的属性名吗?

此问题是间接提出的stackoverflow question。答案似乎是@Squeegy的普遍共识:

你可以使用这些单词,但只能作为字符串而不是速记属性 - foo["class"]很酷,而foo.class不是
帮助提供list of reserved words

的链接

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

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

  • HTMLFormElement使无法在“速记”中使用保留字

首先,使用保留字列表,每个都作为属性添加到ObjectHTMLElement,同时添加为obj["word"]obj.word,然后检索为{ {1}}和obj["word"]。在所有63个案例中,所有8个测试都正常工作。

其次,HTMLFormElement需要这样做,因为它使用简写表示法在其元素中检索。如果obj.word是表单的元素,则<input name='typeof' value='scalar' /> ==“标量”。

根据我的经验,保留字通常是数据(例如,名为“私人”的列),而不是程序造成的。因此,它们会污染JSON对象,并从那里污染INPUT,然后从那里污染HTMLFormElement。简单地说,没有大量(不需要的)工作,就不可能保留的保留字被迫以速记方式正常工作。

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

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

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

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

这个结论是否正确,保留字作为属性名称,并以字符串或简写方式访问它们就好了 - 只要对情况应用一点常识?

4 个答案:

答案 0 :(得分:48)

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

也就是说,保留字仍然可以 NOT 用作标识符名称。这在规范中非常明确地说明,并且在这里有点强调(如果你不想让你的眼睛因为必须阅读实际的语言规范而流血)......

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

  

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

答案 1 :(得分:7)

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

(但是有两个小注释:foo["class"]没问题,而不是foo[class]。您应该使用form.elements["xyz"]而不是form.xyz来访问名为{{的xyz元素。 1}}。)

答案 2 :(得分:6)

是的,可以使用它。

请注意,如果您使用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

这是Online JavaScript/CSS Compression Using YUI Compressor,可以对此进行测试。

答案 3 :(得分:2)

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

在Kangax兼容性表格中实际上是&#34;保留字作为属性名称&#34;

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