Все объекты JSON также являются действительными объектами JavaScript?

Стандарт JSON определяет объекты в одном ключе, а ECMAScript (JavaScript) определяет его в другом,

Часто говорят, что объекты JSON являются подмножеством объектов JavaScript, это правда?

Является ли каждый объект JSON также действительным объектом JavaScript?

Ответ 1

Обновление 2019: ответ теперь ДА от этого предложения и версии JavaScript следующие ECMAScript 2019 ( в том числе) будет собственно надмножествами.


TL; DR

Ответ - нет". Есть случаи, когда объект JSON не будет действительным для JavaScript. JSON НЕ является подмножеством JavaScript.

"Маленькая" разница

JSON

То есть: благодаря спецификации JSON вы можете безопасно использовать такие символы, как U + 2028 в любой строке. Это символ пробела в Юникоде. Не контроль или другой специальный символ.

enter image description here

JavaScript

Ну, а теперь в JavaScript. ECMA-262 имеет небольшую разницу в определении строк. В разделе 7.8.4 есть такая вещь, что строка может содержать все, кроме кавычек, обратной косой черты или конца строки. Теперь какой терминатор строки? Это в разделе 7.3:

  • \u000A - перевод строки
  • \u000D - возврат каретки
  • \u2028 - Разделитель строк
  • \u2029 - Разделитель абзацев

Как видите, в JavaScript символы U + 2028 и U + 2029 не допускаются.

Это образец, но, поскольку у нас есть хотя бы один случай различий, достаточно понять, что ответ не

Источник изображения и полное описание: timelessrepo

Ответ 2

Во-первых, следует соблюдать осторожность при использовании термина "объект 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;