MDC описывает ==
оператора следующим образом :
Если два операнда не одного типа, JavaScript преобразует операнды, а затем применяет строгое сравнение. Если один из операндов является числом или логическим значением, операнды по возможности преобразуются в числа; иначе, если один из операндов является строкой, другой операнд преобразуется в строку, если это возможно.
Имея это в виду, я бы оценил "true" == true
следующим образом:
- Они одного типа? Нет
- Операнд - это число или логическое значение? да
- Можем ли мы преобразовать оба значения в число? Нет (
isNaN(Number("true")) // true
) - Является ли любой из операндов строкой? да
- Можем ли мы преобразовать другой операнд в строку? Да (
String(true) === "true" // true
)
Я закончил со строками "true"
и "true"
, которые должны быть оценены true
, но JavaScript показывает false.
Что я пропустил?
javascript
string
equals
Исаак
источник
источник
if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}
---> "нет да"Ответы:
Потому
"true"
что преобразуется вNaN
, аtrue
преобразуется в1
. Итак, они разные.Как вы сообщили, оба они преобразуются в числа, потому что, по крайней мере,
true
могут быть (см. Комментарий Эрика Реппена), а затем сравниваются.источник
Can we convert both to a number?
будет ложным? Если четноеNaN
число, как этот шаг может потерпеть неудачу?Number(true)
иNumber('true')
Оператор
==
сравнения определен в ECMA 5 как:вернуть результат сравнения x == ToNumber (y).
вернуть результат сравнения ToNumber (x) == y.
Итак, «истина» == истина оценивается как:
===> ложь
источник
Согласно абстрактному алгоритму сравнения равенства
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
если одно из опреде- лений является логическим, а другое - нет, логическое значение преобразуется в число 0 или 1., поэтому
true == "true"
оно ложно.источник