所有 JSON 对象都是有效的 JavaScript 对象吗?

IT技术 javascript json encoding character-encoding
2021-03-15 16:19:07

JSON标准定义的对象以某种方式和ECMAScript的(JavaScript的)标准定义它在另一个。

人们常说 JSON 对象是 JavaScript 对象的一个​​子集,这是真的吗?

每个 JSON 对象也是有效的 JavaScript 对象吗?

2个回答

2019 年更新根据本提案现在的答案是肯定的ECMAScript 2019(包括)之后的 JavaScript 版本将是正确的超集。


TL; 博士

答案是不”。有些情况下 JSON 对象对 JavaScript 无效。JSON 不是 JavaScript 的子集。

“小”区别

JSON

也就是说:由于 JSON 规范,您可以安全地在任何字符串中使用诸如U+2028 之类的字符。它是一个unicode 空白字符。不是控制或其他特殊字符。

在此处输入图片说明

JavaScript

好吧,现在在 JavaScript 中。ECMA-262 对字符串的定义略有不同。第 7.8.4 节中有一个东西,该字符串可以包含除引号、反斜杠或行终止符之外的所有内容现在什么是行终止符?它在第 7.3 节中

  • \u000A - 换行
  • \u000D - 回车
  • \u2028 - 行分隔符
  • \u2029 - 段落分隔符

如您所见,在 JavaScript中不允许使用符号U+2028U+2029

这是一个示例,但由于我们至少有一个差异案例,因此意识到答案是否定的就足够了

图片来源和完整描述:timelessrepo

首先,在使用术语“JSON 对象”时应采取一些预防措施:

如果需要,“JSON 对象”可以指 JSON 文本表示的对象甚至JSON 规范也定义了“对象”的含义:

对象是零个或多个名称/值对的无序集合

这只是一个意图,因为 JSON 本身不是一种处理语言:它不会将文本解析为对象。

并非所有 JSON 文本都表示对象(例如,它们可以表示字符串或数字文字),所以说“JSON 对象”确实有一些附加值:它是“表示对象的 JSON 文本”的缩写。

这就像说“电子邮件通知”。电子邮件是一种通信机制,一个特定的电子邮件可以代表给您的消息。它可能代表某事的通知,但不一定是。

JSON 与 JavaScript 对象字面量

虽然“JSON 对象”可能是一个有效术语,但它不应用于 JavaScript 对象。JSON 可用于多种语言平台,因此与 JavaScript 的历史联系真的应该放在一边。

JavaScript 对象字面量具有除 JSON 之外的其他语法规则,因此不应混淆它们。例如:

  • JSON 要求字符串用双引号括起来,而 JavaScript 对象字面量可能有不带引号的属性名称和单引号字符串;
  • JSON 仅限于几种数据类型,而 JavaScript 对象字面量可能包括其他数据类型和符号,如正则表达式字面量、模板字面量、函数等;
  • JSON 不允许数组文字中的空元素,而 JavaScript 文字允许(例如[1, , 2]);
  • JSON 允许字符串中的U+2028U+2029字符。在 EcmaScript2019 之前,这些字符需要在 JavaScript 中进行转义。EcmaScript2019消除了这种差异
我完全同意你的观点。我在术语“JSON 对象”上添加了此介绍,因为它对访问者似乎很有用。我经常参考这个有用的问题,比如这里在这种情况下,触及超出您问题的某些方面似乎很有用。
2021-04-18 16:19:07
JSON 对象在我链接到的规范中有很好的定义。JSON 不再是 JavaScript(或 XML,或 C 是​​)的“文本”——JSON 清楚地定义了什么是属性(在规范中)以及它们的行为方式。它没有定义这些属性的任何行为(因为它是一种数据交换格式)。例如,JSON 对象{"x": 1e99999}在语法方面是一个有效的 JavaScript 对象,但在语义上超出了 JavaScript 的范围(因为双精度不能容纳那么大的数字)。
2021-04-25 16:19:07
我意识到人们有时会将 JSON 对象误认为 JS 对象,反之亦然,因为它是相同的通用符号,但这不是问题。问题具体在于是否有一个 JSON 对象在被解析为 JavaScript 对象时无效(即,证明 JavaScript 的实际对象表示法不是 JSON 对象表示法的“超集”)。在您的所有观点中 - 唯一证明这一点的是最后一个 - 最后一个答案涵盖了这一点。感谢您发布答案!
2021-05-04 16:19:07