所有的JSON对象都是合法的JavaScript对象吗?

30

JSON标准以一种方式定义了对象,而ECMAScript(JavaScript)标准则以另一种方式定义对象。

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

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

2个回答

38

2019更新:根据这个提案和遵循ECMAScript 2019(含)之后版本的JavaScript,现在可以正常替代。


简短概述

答案是“不行”。有些情况下,JSON对象在JavaScript中不会有效。JSON并非JavaScript的子集。

“微小”的差别

JSON

也就是说:根据JSON规范,你可以在任何字符串中安全地使用一些字符,比如U+2028。它是一个unicode空格字符,而不是控制字符或其他特殊字符。

enter image description here

JavaScript

现在讲解 JavaScript。ECMA-262 中对字符串的定义有一点不同。在 第7.8.4节 中,有一项规定,字符串可以包含除引号、反斜杠或行终止符之外的所有内容。那么什么是行终止符呢?它在 第7.3节 中:

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

正如您所看到的,在 JavaScript 中,符号U+2028U+2029是不允许的。

这只是一个示例,但由于我们至少有一个不同的情况,因此足以意识到答案是否定的。

图片来源和完整描述:timelessrepo


3
首先,在使用术语“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+2028和U+2029字符。在EcmaScript2019之前,这些字符需要在JavaScript中转义。这种差异被EcmaScript2019消除了。

1
一个JSON对象在我链接的规范中有明确定义。JSON不比JavaScript(或XML、C)更多是“文本”——JSON清楚地定义了属性(在规范中)以及它们的行为。它没有定义这些属性的任何行为(因为它是一种数据交换格式)。例如,JSON对象{"x": 1e99999}在语法上是一个有效的JavaScript对象,但在语义上超出了JavaScript的范围(因为双精度浮点数无法容纳如此大的数字)。 - Benjamin Gruenbaum
2
我意识到人们有时会将JSON对象误认为是JS对象,反之亦然,因为它们具有相同的“通用符号”,但这不是问题所在。问题明确要求是否存在一个JSON对象,当解析为JavaScript对象时无效(即证明JavaScript的实际对象符号不是JSON对象符号的“超集”)。在你提出的所有观点中,唯一证明了这一点的是最后一个,而上一个答案已经涵盖了这个问题。感谢您的回答! - Benjamin Gruenbaum
2
我完全同意你的观点。我添加了“JSON对象”这个术语的介绍,因为它对访问者来说似乎很有用。我经常参考这个有用的问题,比如在这里。在那种情况下,涉及到一些超出你的问题范围的方面,所以提及它们似乎很有用。 - trincot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接