28

我一直看到这一点:声明的对象文字使得一些键用引号括起来,而另一些则没有。来自 jQuery 1.4.2 的示例:

jQuery.props = {
    "for": "htmlFor",
    "class": "className",
    readonly: "readOnly",
    maxlength: "maxLength",
    cellspacing: "cellSpacing",
    rowspan: "rowSpan",
    colspan: "colSpan",
    tabindex: "tabIndex",
    usemap: "useMap",
    frameborder: "frameBorder"
};

将前两个属性键 (forclass) 用引号括起来,而其他的不带引号有什么意义?有什么区别吗?

我一直在研究ECMAScript 5 规范;我所能找到的只是[第 15.12.3 节的注释 6,强调我的]:

注 6 对象呈现为左大括号后跟零个或多个属性,用逗号分隔,右大括号关闭。属性是一个带引号的字符串,表示键或属性名称、冒号,然后是字符串化的属性值。数组呈现为左括号,后跟零个或多个值,用逗号分隔,用右括号关闭。

但是,这仅指JSON的字符串化。

4

5 回答 5

37

这些是 Javascript 保留字,并且(虽然不是真的必要)语言的语法要求它们被引用。

严格来说,纯“JSON”表示法要求所有“关键”字符串都被引用。然而,Javascript 本身可以使用不带引号的有效标识符(但不是保留字)的键。

于 2010-02-27T20:35:56.687 回答
5

在这一点上(两年多后)引用对象文字属性是有原因的。如果想使用 Closure Compiler 缩小他们的代码,他们可能需要使其他源文件可以访问这些属性。在这种情况下,他们将希望避免编译器重命名符号。通过引用属性名称,闭包编译器不会缩小(重命名)它们。

请参阅:删除要保留的代码

(这至少适用于 ADVANCED_OPTIMIZATIONS 设置。)

于 2012-10-26T16:30:52.377 回答
2

Javascript 语言关键字或保留关键字总是用引号括起来。

于 2010-02-27T20:35:45.907 回答
1

for并且class是语言关键字。当那些没有被引用时,你的解释器会抛出一个 SyntaxError 。

请参阅您链接到的规范中的第 7.6.1.1 节。

于 2010-02-27T20:36:21.170 回答
1

Javascript 有很多保留字,我认为这些保留字是为将来可能使用的语言保留的。class是其中之一,即使 Javascript 实际上并不使用类。另一个是goto并且绝对没有机会使用它。但是,结果是,如果您想将这些用作 json 键,则必须将其引用。严格来说,您可能应该始终引用您的密钥,以避免与 javascript 未使用的保留字陷阱发生冲突(请注意 - 我从不这样做)。

于 2010-02-27T20:51:25.603 回答