Сравнение x === y называется строгим сравнением x и у, и в основном все знают как это работает.
Однако x == y, которое называется абстрактным сравнением x и у, может вызывать непонимание того, почему оно так работает.
Результаты абстрактного сравнения не вычисляются случайным образом, алгоритм абстрактного сравнения описан в спецификации языка JavaScript в пункте 7.2.13.
Такое сравнение производится следующим образом:
- Если Type(x) является таким же как Type(y), то
а. Возвратить результат произведения строго сравнения x === y.
- Если x — null и y — undefined, возвратить true.
- Если x — undefined и y — null, возвратить true.
- Если Type(x) — Number и Type(y) — String, возвратить результат сравнения x == ToNumber(y).
- Если Type(x) — String и Type(y) — Number, возвратить результат сравнения ToNumber(x) == y.
- Если Type(x) — Boolean, возвратить результат сравнения ToNumber(x) == y.
- Если Type(y) — Boolean, возвратить результат сравнения x == ToNumber(y).
- Если Type(x) — либо String, либо Number, либо Symbol и Type(y) — Object, возвратить результат сравнения x == ToPrimitive(y).
- Если Type(x) — Object и Type(y) — либо String, либо Number, либо Symbol, возвратить результат сравнения ToPrimitive(x) == y.
- Возвратить 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