为啥引用了一些对象文字属性而其他没有? [复制]

Posted

技术标签:

【中文标题】为啥引用了一些对象文字属性而其他没有? [复制]【英文标题】:Why are some object-literal properties quoted and others not? [duplicate]为什么引用了一些对象文字属性而其他没有? [复制] 【发布时间】:2011-01-21 21:00:30 【问题描述】:

我经常看到:对象字面量声明为一些键用引号引起来,而另一些则没有。一个来自 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 specification;我所能找到的只是 [第 15.12.3 节的注 6,重点是我的]:

注意 6 对象被渲染为 左大括号后跟零或 更多属性,用 逗号,用右大括号括起来。 一个 属性是带引号的字符串 表示键或属性名称, 一个冒号,然后是字符串化的 适当的价值。一个数组被渲染 作为左左括号,后跟 零个或多个值,以 逗号,右括号结束。

不过,这里只指JSON的字符串化

【问题讨论】:

另见What is the difference between object keys with quotes and without quotes? 这怎么可能与十个月后提出的问题重复?你们搞反了。 @raven:另一个问题的答案更好,显然它们不应该合并。我的标志被拒绝了。 :P 这怎么是一个新问题的重复? 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

见:Removal of code you want to keep

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

我的解释器 (FF10) 不会在 for:1,class:1,null:1 上抛出任何东西并将它们视为常规键。 更多信息请见mathiasbynens.be/notes/javascript-properties。【参考方案5】:

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

【讨论】:

以上是关于为啥引用了一些对象文字属性而其他没有? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我应该更喜欢 unsafe_unretained 限定符而不是为弱引用属性赋值? [复制]

如何在 Typescript 的对象文字中定义“任何”数组? [复制]

c++中为啥要函数返回引用?

word复制粘贴颜色怎么没有了

如果 Swift 通过值而不是引用传递,为啥我可以通过将 UIView 传递给函数来在 Swift 中操作 UIView 的属性? [复制]

怎么在canvas上添加边框?