Страницы

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

суббота, 7 декабря 2019 г.

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

#javascript #типы_данных #сравнение


Объясните, пожалуйста, почему из трех алертов ниже исполняется только последний?
Вроде как во всех трёх случаях идет мягкое сравнение на равенство к true

if (true == "0") alert('Тру равно нулю!');

if ("0" == true) alert('Ноль равен тру');

if ("0") alert('Как бы тоже тру, или как?');


https://jsfiddle.net/z1xbshmk/
    


Ответы

Ответ 1



Стоит обратиться к спецификации При вычислении равенства 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), то условие считается выполненным.

Ответ 2



Строка таки преобразуется в ноль, что трактуется как ложь. То же самое, только наоборот аргументы. Это не пустая строка, трактуется как true. Как оно происходит.

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

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