Правильно ли, что JSON.stringify (2) == "2" может возвращать false?

я обнаружил, что в Opera 11.50 выражение

 JSON.stringify(2)

возвращает объект, для которого

  • typeof возвращает "string"
  • constructor.name is String
  • charCodeAt(0) это 50
  • length в 1

но все равно

alert(JSON.stringify(2) == "2")

показывает "false" в Opera (и то же самое происходит с помощью ===).

это ошибка или что?

единственный способ, которым я нашел сделать сравнение равным " 2 " - это вызов .substr(0) (например, даже добавление пустой строки по-прежнему сравнивает разные).

1 ответов


это определенно похоже на ошибку.

из спецификации ECMAScript 5.1:

соответствующие реализации JSON.разбор и JSON.stringify должен поддерживать точный формат обмена, описанный в этой спецификации, без каких-либо удалений или расширений формата. Это отличается от RFC 4627, который позволяет синтаксическому анализатору JSON принимать формы и расширения, отличные от JSON.

и:

в формате JSON.преобразовать в строки производит Строка, соответствующая следующей грамматике JSON. формат JSON.parse принимает строку, которая соответствует грамматике json

возможно, он каким-то образом обертывает строку в объект типа "JSONText", который все еще имеет typeof of string но это кажется очень странным.

Я бы определенно подумал, что следующая реализация в этом случае является правильной:

JSON.stringify(2) == "2" && JSON.stringify(2) === "2" && JSON.stringify(2) == 2 && JSON.stringify(2) !== 2;
true

согласно @6502 (см. Комментарий) это true in:
Chrome; Firefox; IE9; iPad Safari; OsX Safari; N1 Android браузер

документ спецификации ECMAScript 5.1:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf