Ответ 1
Потому что "true"
преобразуется в NaN
, а true
преобразуется в 1
. Поэтому они отличаются.
Как вы сообщили, оба преобразованы в числа, потому что по крайней мере true
может быть (см. комментарий Erik Reppen), а затем сравнивается.
MDC описывает оператор ==
следующим образом:
Если два операнда не одного типа, JavaScript преобразует операнды, а затем применяет строгое сравнение. Если любой операнд является числом или логическим, операнды, если это возможно, преобразуются в числа; else, если любой операнд является строкой, другой операнд, если возможно, преобразуется в строку.
Учитывая это, я бы оценил "true" == true
следующим образом:
isNaN(Number("true")) // true
)String(true) === "true" // true
)Я закончил с строками "true"
и "true"
, которые должны оцениваться как true
, но JavaScript показывает false.
Что я пропустил?
Потому что "true"
преобразуется в NaN
, а true
преобразуется в 1
. Поэтому они отличаются.
Как вы сообщили, оба преобразованы в числа, потому что по крайней мере true
может быть (см. комментарий Erik Reppen), а затем сравнивается.
== оператор сравнения, определенный в Ecma 5 как
Итак, "true" == true интерпретируется js engine как
=== > false
В соответствии с алгоритмом сравнения абстрактного равенства
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
если одна из oprends является логической, а другая - нет, boolean - это преобразование в число 0 или 1. поэтому true == "true"
является ложным.