Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   почему true == "5" возвращает false (https://javascript.ru/forum/misc/73703-pochemu-true-%3D%3D-5-vozvrashhaet-false.html)

AkezhanOb1 08.05.2018 12:35

почему true == "5" возвращает false
 
если учесть что для сравнения 0, null, undef, NaN, "", false возвращают false, а все остальное true

"6" возвращает true
true == "6" возвращает false почему ??

Aetae 08.05.2018 12:40

Потому что при сравнении булева со строкой оба значения в данном случае приводятся к числу.
alert(true == "1 ")

Почему так? ¯\_(ツ)_/¯
Там вообще много странного. Никто на память эту хрень не помнит. Используйте ===.

P.S. К true, если очень надо, можно привести напрямую:
alert(Boolean("6"))

Malleys 08.05.2018 14:54

Сравнение x === y называется строгим сравнением x и у, и в основном все знают как это работает.

Однако x == y, которое называется абстрактным сравнением x и у, может вызывать непонимание того, почему оно так работает.

Результаты абстрактного сравнения не вычисляются случайным образом, алгоритм абстрактного сравнения описан в спецификации языка JavaScript в пункте 7.2.13.

Такое сравнение производится следующим образом:
  1. Если Type(x) является таким же как Type(y), то
    а. Возвратить результат произведения строго сравнения x === y.
  2. Если x — null и y — undefined, возвратить true.
  3. Если x — undefined и y — null, возвратить true.
  4. Если Type(x) — Number и Type(y) — String, возвратить результат сравнения x == ToNumber(y).
  5. Если Type(x) — String и Type(y) — Number, возвратить результат сравнения ToNumber(x) == y.
  6. Если Type(x) — Boolean, возвратить результат сравнения ToNumber(x) == y.
  7. Если Type(y) — Boolean, возвратить результат сравнения x == ToNumber(y).
  8. Если Type(x) — либо String, либо Number, либо Symbol и Type(y) — Object, возвратить результат сравнения x == ToPrimitive(y).
  9. Если Type(x) — Object и Type(y) — либо String, либо Number, либо Symbol, возвратить результат сравнения ToPrimitive(x) == y.
  10. Возвратить false.

В принципе, если вы сравниваете значения одного типа, то нет разницы — использовать строгое или абстрактное сравнение, результат всегда будет один и тот же.

Почему true == "5" возвращает false?
Вы теперь знаете алгоритм, но всё-же давайте попробуем вычислить это выражение вручную, используя алгоритм абстрактного сравнения:

true == "5" // подходит 6-ой пункт  -> ToNumber(x) == y -> получаем 1 == "5"
1 == "5"    // теперь подходит 4-ый -> x == ToNumber(y) -> получаем 1 == 5
1 == 5      // теперь 1-ый пункт    -> x === y          -> получаем 1 === 5
1 === 5     // по алгоритму строгого сравнения получаем false
false


P. S. Я точно не знаю, но если вы хотели проверить является ли значение конечным числом, то следует использовать функцию Number.isFinite

AkezhanOb1 08.05.2018 15:19

Супер, огромное вам спасибо


Часовой пояс GMT +3, время: 08:59.