为什么 JSON 键应该用引号引起来的真正原因取决于 ECMAScript 3 标识符的语义。
保留字不能用作不带引号的对象文字中的属性名称,例如:
({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...
如果您使用引号,则属性名称是有效的:
({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok
自己的 Crockford 在本次演讲中解释了这一点,他们希望保持 JSON 标准简单,并且不希望对其进行所有这些语义限制:
……
那时我们发现了未引用的名称问题。事实证明,ECMA Script 3 有一个保留字策略。保留字一定要在关键位置引用,实在是太麻烦了。当我开始将其制定为标准时,我不想将所有保留字都放入标准中,因为它看起来真的很愚蠢。
当时,我试图说服人们:是的,你可以用 JavaScript 编写应用程序,它确实可以工作,而且它是一门很好的语言。我不想同时说:看看他们所做的这件非常愚蠢的事情!所以我决定,让我们只引用键。
这样,我们就不必告诉任何人它有多糟糕。
这就是为什么,直到今天,密钥仍以 JSON 格式引用。
...
ECMAScript 第 5 版标准修复了这个问题,现在在 ES5 实现中,即使是保留字也可以在不带引号的情况下使用,对象文字和成员访问(obj.function
在 ES5 中为 Ok)。
只是为了记录,这个标准现在由软件供应商实施,你可以在这个兼容性表上看到哪些浏览器包含这个特性(参见保留字作为属性名称)