Почему "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"
ложно.