Показать сообщение отдельно
  #3 (permalink)  
Старый 08.05.2018, 14:54
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сравнение 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

Последний раз редактировалось Malleys, 08.05.2018 в 14:58.
Ответить с цитированием