Подтвердить что ты не робот

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

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

 JSON.stringify(2)

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

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

Но все же

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

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

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

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

4b9b3361

Ответ 1

Это определенно выглядит как ошибка.

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

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

и

JSON.stringify создает строку, которая соответствует следующей грамматике 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 в:
Хром; Fire Fox; IE9; iPad Safari; OsX Safari; браузер Android N1

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