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

时间:2014-05-20 06:07:56

标签: javascript json encoding character-encoding

JSON标准以一种方式定义对象,ECMAScript (JavaScript)标准在另一种方式中定义对象。

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

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

2 个答案:

答案 0 :(得分:30)

更新2019 :从this proposal开始,答案现在是 YES ,而ECMAScript 2019(包括)之后的JavaScript版本将是正确的超集。


TL; DR

答案是" no"。有些情况下,JSON对象不会对JavaScript有效。 JSON不是JavaScript子集。

"小"差

<强> JSON

即:由于JSON规范,您可以安全地在任何字符串中使用 U + 2028 等字符。它是 unicode whitespace 字符。不控制或其他特殊角色。

enter image description here

<强>的JavaScript

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

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

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

这是一个示例,但由于我们有至少一个差异的情况,因此很好地意识到答案是

图片来源&amp;完整说明:timelessrepo

答案 1 :(得分:2)

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

如果需要,“JSON对象”可以引用JSON文本表示的对象。甚至JSON specification也定义了“对象”的含义:

  

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

这只是一个 intent ,因为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;
  • 取消了这种差异