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

Posted

技术标签:

【中文标题】所有 JSON 对象都是有效的 JavaScript 对象吗?【英文标题】:Are all JSON objects also valid JavaScript objects? 【发布时间】:2014-07-08 06:20:03 【问题描述】:

JSON 标准以一种方式定义对象,ECMAScript (javascript) 标准以另一种方式定义它。

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

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

【问题讨论】:

【参考方案1】:

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

如果您愿意,“JSON 对象”可以指代 JSON 文本表示的对象。甚至JSON specification 也定义了“对象”的含义:

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

这只是一个意图,因为 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 对象在我链接到的规范中得到了很好的定义。 JSON 不再是 JavaScript(或 XML,或 C 是​​)“文本”——JSON 清楚地定义了哪些属性(在规范中)以及它们的行为方式。它没有定义这些属性的任何行为(因为它是一种数据交换格式)。例如,JSON 对象 "x": 1e99999 在语法上是一个有效的 JavaScript 对象,但在语义上超出了 JavaScript 的范围(因为双精度数不能容纳那么大的数字)。 我意识到人们有时会将 JSON 对象误认为 JS 对象,反之亦然,因为它是相同的通用符号,但这不是问题所在。问题是,如果有一个 JSON 对象在解析为 JavaScript 对象时无效(也就是说,证明 JavaScript 的实际对象表示法不是 JSON 对象表示法的“超集”)。在您的所有观点中-唯一证明这一点的观点是最后一个-最后一个答案涵盖了。感谢您发布答案! 我完全同意你的看法。我在术语“JSON 对象”上添加了这个介绍,因为它似乎对访问者有用。我经常提到这个有用的问题,比如here。在这种情况下,触及您的问题之外的某些方面似乎很有用。【参考方案2】:

2019 年更新:从 this proposal 开始,答案现在是YES,并且 ECMAScript 2019(包括)之后的 JavaScript 版本将是适当的超集。


TL;DR

答案是“不”。在某些情况下,JSON 对象对 JavaScript 无效。 JSON 不是 JavaScript 子集。

“小”差异

JSON

即:由于 JSON 规范,您可以安全地在任何字符串中使用此类字符,如 U+2028。它是一个 unicode 空格 字符。不是控件或其他特殊字符。

JavaScript

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

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

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

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

就足够了

图片来源及完整描述:timeles-s-repo

【讨论】:

以上是关于所有 JSON 对象都是有效的 JavaScript 对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

JavaScrip对象

JavaScrip t对象和 JSON 数据格式转换

JavaScrip ajaxt和python flask通过json传递数据的方法