【问题标题】:Why should the "key" part in a JS hash/dict be a string?为什么 JS hash/dict 中的“key”部分应该是字符串?
【发布时间】:2010-10-18 03:21:58
【问题描述】:

在大多数 JSON 序列化器/反序列化器中,javascript 字典/哈希数组中的“键”部分写成字符串。

使用字符串作为键而不是只输入想要的名称有什么好处?

例如,假设我定义了两个对象k1k2,如下所示:

var k1 = { a: 1, b: 2, c: 3 };          // define name normally
var k2 = { "a": 1, "b": 2, "c": 3 };    // define name with a string

然后我进行了以下测试:

alert(k1 == k2);                   // false (of course)

alert(k1.a == k2.a);               // true
alert(k1["b"] == k2["b"]);         // true

alert(uneval(k1));                 // returns the k1 object literal notation.
alert(uneval(k2));                 // returns the same string as above line.

alert(uneval(k1) == uneval(k2));   // true

那么像k2 的定义那样将键放在双引号(一个字符串)中,而不是像k1 的定义那样仅仅键入键名有什么意义呢?


我刚刚在Ajaxian 看到这个指向Aaron Boodman's blog entry

chromium.tabs.createTab({
 "url": "http://www.google.com/",
 "selected": true,
 "tabIndex": 3
});

由于他也对 tabIndex 使用驼峰式大小写,所以我根本看不出使用字符串有任何意义。

为什么不:

chromium.tabs.createTab({
 url: "http://www.google.com/",
 selected: true,
 tabIndex: 3
});

为什么 JS ninja 会遵循将urlselectedtabIndex 转换为字符串的约定?

【问题讨论】:

    标签: javascript dictionary coding-style


    【解决方案1】:

    因为JSON 是实际 JavaScript 文字语法的子集。为了简化 JSON 解析器的实现,字符串始终需要双引号,并且由于 JSON 中的键是字符串,因此它们是必需的。

    并非所有合法的 JavaScript 都是合法的 JSON。虽然您可以在 JavaScript 中定义不带引号的对象字面量,但如果您想要可互操作的 JSON,则需要将它们放入。

    【讨论】:

    • 我想javascript中的约定只是因为使用大量的JSON而泄露了......
    • 我相信 python 兼容性是引用的原因
    • @chakrit 是的。此外,正如 gizmo 所指出的,在 JavaScript 中使用引号通常更安全,因为您不必担心保留字。例如 {do: "something"} 不是合法的 JavaScript。
    • 实际上“{do: "something"}” 确实有效!显然,还有其他字符和字符串可能会混淆该语法,因此您有时会需要引号,如果需要,有时它们可​​能最容易总是包含它们。
    • @bobince 哎呀,你是对的。当我测试它时,我的语法又犯了一个错误,这个错误让我失望了。
    【解决方案2】:

    因此,您可以避免错误地使用 javascript 保留关键字,例如“do”。使用字符串表示法可以保证您的安全。

    【讨论】:

      【解决方案3】:

      如果相信 json.org 上的语法图,裸词属性名称是非标准的。您在多少个浏览器上运行了测试?

      【讨论】:

      • 不多...但我确实在工作中维护了一个巨大的 javascript 应用程序。而且我一直使用裸词名称(例如创建类等),它适用于所有主要浏览器...... IE FF Opera Safari。
      • JSON 是 JavaScript 的子集。它需要引号,但 JavaScript 不需要。
      【解决方案4】:

      除了保留关键字之外,您实际上可以在属性名称中使用任何字符 - 包括空格、冒号...

      不太清楚你为什么要这样做。我更喜欢使用普通的“对象”表示法。

      【讨论】:

        猜你喜欢
        • 2012-06-17
        • 1970-01-01
        • 2019-06-15
        • 1970-01-01
        • 2013-03-09
        • 2012-05-12
        • 1970-01-01
        • 2018-06-12
        相关资源
        最近更新 更多