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


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

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

имея это в виду, я бы оценил "true" == true как следует:

  1. они одного типа? нет
  2. является ли операнд числом или булевым? да
  3. мы можем преобразовать в число? нет (isNaN(Number("true")) // true)
  4. является ли операнд строкой? да
  5. можем ли мы преобразовать другой операнд в строку? да (String(true) === "true" // true)

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

что я пропустила?

3 71

3 ответа:

, потому что "true" превращается в NaN, в то время как true превращается в 1. Так что они отличаются.

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

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

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

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

  1. "true" = = toNumber (true)
  2. "true" = = 1
  3. toNumber ("true") = = 1
  4. NaN = = 1

===> false

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

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

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