的JSON标准定义的对象以某种方式和ECMAScript的(JavaScript的)标准定义它在另一个。
人们常说 JSON 对象是 JavaScript 对象的一个子集,这是真的吗?
每个 JSON 对象也是有效的 JavaScript 对象吗?
的JSON标准定义的对象以某种方式和ECMAScript的(JavaScript的)标准定义它在另一个。
人们常说 JSON 对象是 JavaScript 对象的一个子集,这是真的吗?
每个 JSON 对象也是有效的 JavaScript 对象吗?
2019 年更新:根据本提案,现在的答案是肯定的,ECMAScript 2019(包括)之后的 JavaScript 版本将是正确的超集。
答案是不”。有些情况下 JSON 对象对 JavaScript 无效。JSON 不是 JavaScript 的子集。
JSON
也就是说:由于 JSON 规范,您可以安全地在任何字符串中使用诸如U+2028 之类的字符。它是一个unicode 空白字符。不是控制或其他特殊字符。
JavaScript
好吧,现在在 JavaScript 中。ECMA-262 对字符串的定义略有不同。在第 7.8.4 节中有一个东西,该字符串可以包含除引号、反斜杠或行终止符之外的所有内容。现在什么是行终止符?它在第 7.3 节中:
如您所见,在 JavaScript中不允许使用符号U+2028和U+2029。
这是一个示例,但由于我们至少有一个差异案例,因此意识到答案是否定的就足够了
图片来源和完整描述:timelessrepo
首先,在使用术语“JSON 对象”时应采取一些预防措施:
如果需要,“JSON 对象”可以指 JSON 文本表示的对象。甚至JSON 规范也定义了“对象”的含义:
对象是零个或多个名称/值对的无序集合
这只是一个意图,因为 JSON 本身不是一种处理语言:它不会将文本解析为对象。
并非所有 JSON 文本都表示对象(例如,它们可以表示字符串或数字文字),所以说“JSON 对象”确实有一些附加值:它是“表示对象的 JSON 文本”的缩写。
这就像说“电子邮件通知”。电子邮件是一种通信机制,一个特定的电子邮件可以代表给您的消息。它可能代表某事的通知,但不一定是。
虽然“JSON 对象”可能是一个有效术语,但它不应用于 JavaScript 对象。JSON 可用于多种语言平台,因此与 JavaScript 的历史联系真的应该放在一边。
JavaScript 对象字面量具有除 JSON 之外的其他语法规则,因此不应混淆它们。例如:
[1, , 2]
);U+2028
和U+2029
字符。在 EcmaScript2019 之前,这些字符需要在 JavaScript 中进行转义。EcmaScript2019消除了这种差异;