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

Почему "true" == true показывает false в JavaScript?

MDC описывает оператор == следующим образом:

Если два операнда не одного типа, JavaScript преобразует операнды, а затем применяет строгое сравнение. Если любой операнд является числом или логическим, операнды, если это возможно, преобразуются в числа; else, если любой операнд является строкой, другой операнд, если возможно, преобразуется в строку.

Учитывая это, я бы оценил "true" == true следующим образом:

  • Являются ли они одного типа? Нет
  • Является ли операндом число или логическое? Да
  • Можно ли преобразовать оба числа в число? Нет (isNaN(Number("true")) // true)
  • Является ли либо операндом строка? Да
  • Можно ли преобразовать другой операнд в строку? Да (String(true) === "true" // true)

Я закончил с строками "true" и "true", которые должны оцениваться как true, но JavaScript показывает false.

Что я пропустил?

4b9b3361

Ответ 1

Потому что "true" преобразуется в NaN, а true преобразуется в 1. Поэтому они отличаются.

Как вы сообщили, оба преобразованы в числа, потому что по крайней мере true может быть (см. комментарий Erik Reppen), а затем сравнивается.

Ответ 2

== оператор сравнения, определенный в Ecma 5 как

  1. Если Type (x) - Number и Type (y) - String, верните результат сравнения x == ToNumber (y).
  2. Если Type (x) - String и Type (y) - Number,
  3. Если Type (x) является логическим, верните результат сравнения ToNumber (x) == y.
  4. Если тип (y) является логическим, верните результат сравнения x == ToNumber (y).

Итак, "true" == true интерпретируется js engine как

  • "true" == toNumber (true)
  • "true" == 1
  • toNumber ( "true" ) == 1
  • NaN == 1

=== > false

Ответ 3

В соответствии с алгоритмом сравнения абстрактного равенства

http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

если одна из oprends является логической, а другая - нет, boolean - это преобразование в число 0 или 1. поэтому true == "true" является ложным.