【发布时间】:2014-07-08 06:20:03
【问题描述】:
JSON 标准以一种方式定义对象,ECMAScript (JavaScript) 标准以另一种方式定义它。
人们常说 JSON 对象是 JavaScript 对象的子集,这是真的吗?
每个 JSON 对象也是有效的 JavaScript 对象吗?
【问题讨论】:
标签: javascript json encoding character-encoding
JSON 标准以一种方式定义对象,ECMAScript (JavaScript) 标准以另一种方式定义它。
人们常说 JSON 对象是 JavaScript 对象的子集,这是真的吗?
每个 JSON 对象也是有效的 JavaScript 对象吗?
【问题讨论】:
标签: javascript json encoding character-encoding
2019 年更新:从 this proposal 开始,答案现在是YES,并且 ECMAScript 2019(包括)之后的 JavaScript 版本将是适当的超集。
答案是“不”。在某些情况下,JSON 对象对 JavaScript 无效。 JSON 不是 JavaScript 子集。
JSON
即:由于 JSON 规范,您可以安全地在任何字符串中使用此类字符,如 U+2028。它是一个 unicode 空格 字符。不是控件或其他特殊字符。
JavaScript
好吧,现在在 JavaScript 中。 ECMA-262 对字符串的定义略有不同。在section 7.8.4 中有一个东西,该字符串可以包含除引号、反斜杠或行终止符 之外的所有内容。现在什么是行终止符?它在section 7.3:
如您所见,在 JavaScript 中,不允许使用 U+2028 和 U+2029 符号。
这是一个示例,但由于我们有至少一个不同的情况,因此意识到答案是否
就足够了图片来源及完整描述:timelessrepo
【讨论】:
首先,在使用术语“JSON 对象”时应采取一些预防措施:
如果您愿意,“JSON 对象”可以指代 JSON 文本表示的对象。甚至JSON specification 也定义了“对象”的含义:
对象是零个或多个名称/值的无序集合 对
这只是一个意图,因为 JSON 本身不是一种处理语言:它不会将文本解析为对象。
并非所有 JSON 文本都表示对象(例如,它们可以表示字符串或数字字面量),所以说到“JSON 对象”确实有一些附加价值:它是“表示对象的 JSON 文本”的缩写。
这就像说“电子邮件通知”。电子邮件是一种通信机制,一封特定的电子邮件可以代表给您的信息。它可能代表某事的通知,但不一定是。
虽然“JSON 对象”可能是一个有效术语,但它不应用于 JavaScript 对象。 JSON 可以在许多语言平台中使用,因此与 JavaScript 的历史联系真的应该搁置一旁。
JavaScript 对象字面量除了 JSON 之外还有其他语法规则,因此不应混淆。例如:
[1, , 2]);U+2028 和 U+2029 字符。在 EcmaScript2019 之前,这些字符需要在 JavaScript 中进行转义。 EcmaScript2019 消除了这种差异;【讨论】:
{"x": 1e99999} 在语法上是一个有效的 JavaScript 对象,但在语义上超出了 JavaScript 的范围(因为双精度数不能容纳那么大的数字)。