Почему "true" = = true показывает false в JavaScript?
MDC описывает == оператор следующим образом:
если два операнда не имеют одного и того же типа, JavaScript преобразует операнды, а затем применяет строгое сравнение. Если какой-либо операнд является числом или логическим, операнды преобразуются в числа, если это возможно; в противном случае, если один из операндов является строкой, другой операнд преобразуется в строку, если это возможно.
имея это в виду, я бы оценил "true" == true как следует:
- они одного типа? нет
- является ли операнд числом или булевым? да
- мы можем преобразовать в число? нет (
isNaN(Number("true")) // true) - является ли операнд строкой? да
- можем ли мы преобразовать другой операнд в строку? да (
String(true) === "true" // true)
Я закончил со строки "true" и "true", который должен оценить до true, но JavaScript показывает false.
что я пропустила?
3 ответа:
, потому что
"true"превращается вNaN, в то время какtrueпревращается в1. Так что они отличаются.как вы сообщили, оба преобразуются в числа, потому что по крайней мере
trueможно (см. комментарий Эрика Реппена), а затем сравнить.
== оператор сравнения, определенный в Ecma 5 как
- если тип (x) - это число, а тип (y) - строка, возвращает результат сравнения x == ToNumber (y).
- если тип (x) - строка, а тип(y) - число,
- если тип(x) является логическим, возвращает результат сравнения ToNumber (x) == y.
- если тип(y) является логическим, возвращает результат сравнения x == ToNumber (y).
Итак, "true" = = true is интерпретируется JS engine как
- "true" = = toNumber (true)
- "true" = = 1
- toNumber ("true") = = 1
- NaN = = 1
===> false
в соответствии с алгоритмом сравнения абстрактного равенства
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
если один из опрендов является логическим, а другой нет, boolean преобразуется в число 0 или 1. так что
true == "true"ложно.