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

我经常看到:对象字面量声明为一些键用引号引起来,而另一些则没有。一个来自 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的字符串化

【问题讨论】:

标签: javascript json quotes object-literal


【解决方案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 节。

        【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2023-04-05
          • 2013-06-08
          • 1970-01-01
          • 2019-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-06
          相关资源
          最近更新 更多