Все объекты 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;