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


89

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

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

Имея это в виду, я бы оценил "true" == trueследующим образом:

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

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

Что я пропустил?


Релевантно: es5.github.com/#x11.9.1
zzzzBov 06

6
Вокруг так много JavaScript, что мир - страшное место: if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}---> "нет да"
user1068352

1
Должен сказать, я удивлен, и это ооочень глупо, что это происходит. Еще одна причина всегда всегда использовать ===
BT

Ответы:


89

Потому "true"что преобразуется в NaN, а trueпреобразуется в 1. Итак, они разные.

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


Можете ли вы сказать мне, когда этот шаг Can we convert both to a number?будет ложным? Если четное NaNчисло, как этот шаг может потерпеть неудачу?
Isaac

5
Либо против другого. Если оба результата приведут к NaN, они переключатся на оценку строки. Если только один может быть преобразован, все равно остается сравнение чисел.
Erik Reppen

2
На самом деле в Javascript есть несколько странных объектов, которые ведут себя довольно странно. Например, документы XML в IE <9 вызывают ошибку при попытке преобразовать их в числа.
MaxArt 06

Вы можете сами увидеть конверсии, сделав Number(true)иNumber('true')
Эрик Реппен

10

Оператор ==сравнения определен в ECMA 5 как:

  1. Если Type (x) - Number, а Type (y) - String,
    вернуть результат сравнения x == ToNumber (y).
  2. Если Type (x) - String, а Type (y) - Number,
    вернуть результат сравнения ToNumber (x) == y.
  3. Если Type (x) имеет значение Boolean, вернуть результат сравнения ToNumber (x) == y.
  4. Если Type (y) имеет значение Boolean, вернуть результат сравнения x == ToNumber (y).

Итак, «истина» == истина оценивается как:

  1. "true" == ToNumber (true)   (по правилу 7)
  2. "истина" == 1
  3. ToNumber ("true") == 1   (по правилу 5)
  4. NaN == 1

===> ложь


3

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

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

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


Правильно ли я сделал следующий вывод? «истина» == истина становится «истиной» == 1, а затем становится «истиной» == «1». Почему они возвращают ложь?
vuquanghoang 01
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.