Страницы

Поиск по вопросам

пятница, 12 октября 2018 г.

Преобразование скалярных типов при сравнении JavaScript

Объясните, пожалуйста, почему из трех алертов ниже исполняется только последний? Вроде как во всех трёх случаях идет мягкое сравнение на равенство к true
if (true == "0") alert('Тру равно нулю!');
if ("0" == true) alert('Ноль равен тру');
if ("0") alert('Как бы тоже тру, или как?');
https://jsfiddle.net/z1xbshmk/


Ответ

Стоит обратиться к спецификации При вычислении равенства EqualityExpression == RelationalExpression получаются значения левой и правой части, и к ним применяется Abstract Equality Comparison
Сравнение x == y, где x и y - значения, возвращает true or false. Такое сравнения производится следующим образом: Если Type(x) тот же самый, что и Type(y), тогда возвращается результат выполнения Strict Equality Comparison 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 == "0"
Это выражении соответствует ветке
Если Type(x) - это Boolean, вернуть результат выражения ToNumber(x) == y
При приведении к числу получаем выражение: 1 == "0" попадаем в ветку
Если Type(x) - это Number и Type(y) - это String, вернуть результат выражения x == ToNumber(y).
При приведении к числу получаем выражение: 1 == 0 и как результат: false
Со вторым случаем происходит аналогичное.
Теперь рассмотрим третий случай.
Обратимся опять к спецификации
К выражению внутри скобок применяется функция ToBoolean, которая в случае строки возвращает false если строка пустая(длина строки 0), и true - в противном случае.
Так как "0" - не пустая(длина строки 1), то условие считается выполненным.

Комментариев нет:

Отправить комментарий