Правильно ли, что JSON.stringify (2) == "2" может вернуть false? - PullRequest
27 голосов
/ 14 августа 2011

Я обнаружил, что в 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) (например, даже при добавлении пустой строки все равно сравнивается).

1 Ответ

7 голосов
/ 14 августа 2011

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

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

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

И:

JSON.stringify создает строку, соответствующую следующемуJSON грамматика.JSON.parse принимает строку, соответствующую грамматике JSON

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

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

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

Согласно @ 6502 (см. комментарий) это true in:
хром;Fire Fox;IE9;iPad Safari;OsX Safari;браузер N1 для Android

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

...