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"。使用字符串表示法可以让你处于安全的一侧。