网站搜索

javascript - 为什么 JS 哈希/字典中的“key”部分应该是字符串?


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

使用字符串作为键而不是直接输入预期名称有什么好处?

例如,假设我像这样定义两个对象 k1 和 k2:

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 博客文章的内容:

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 忍者会遵循将 url、selected 和 tabIndex 转换为字符串的约定?

答案#1

因为 JSON 是实际 JavaScript 字面量语法的一个子集。为了简化 JSON 解析器的实现,字符串总是需要用双引号括起来,而且由于 JSON 中的键是字符串,因此在键上也必须使用双引号。

并非所有合法的 JavaScript 都是合法的 JSON。虽然你可以在 JavaScript 中定义对象字面量而不加引号,但如果你想要可互操作的 JSON,你就需要加上引号。

答案#2

因为这样做,你可以避免错误地使用 JavaScript 的保留关键字,例如 "do"。使用字符串表示法可以让你处于安全的一侧。