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

167
23 июля 2019, 18:40

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

if (true == "0") alert('Тру равно нулю!');
if ("0" == true) alert('Ноль равен тру');
if ("0") alert('Как бы тоже тру, или как?');

https://jsfiddle.net/z1xbshmk/

Answer 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), то условие считается выполненным.

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

Как оно происходит.

READ ALSO
Подскажите хороший слайдер [закрыт]

Подскажите хороший слайдер [закрыт]

Нужен слайдер, где будет отображаться три окна и при клике на PREV NEXT будут внутри трёх окон меняться картинкиРазмеры окон разные: будут картинки...

150
Выбор региона WordPress

Выбор региона WordPress

Как сделать на сайте Wordpress выбор региона, ну типа "Какой ваш город" и чтобы далее в зависимости от города менялась информация на сайте, подскажите...

144
Убрать лишнее подзапросом

Убрать лишнее подзапросом

Помогите пожалуйста понять, как сделать выборку в задаче: Есть таблица (извините, туповато выглядит, но ничего умнее не придумалось)

174
ошибка добавление в MySQL

ошибка добавление в MySQL

парсю информацию с каналов телеграм, и необходимо добавить в базу данных MySQL спарсенные значенияПроблема возникает с этой строчкой:

130