为什么 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)。
只是为了记录,这个标准最近由软件供应商实施,您可以在此兼容性表上看到哪些浏览器包含此功能(请参阅保留字作为属性名称)