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

292
30 августа 2017, 17:36

Объясните, пожалуйста, почему из трех алертов ниже исполняется только последний? Вроде как во всех трёх случаях идет мягкое сравнение на равенство к 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
Получить текст элемента из select

Получить текст элемента из select

Есть такой select, нужно определять текст опции при смене варианта, например при смене на "Вариант 2" будет выскакивать его "Выберите вариант...

276
Работа с элементом DOM

Работа с элементом DOM

Не знаю, правильно ли я охарактеризовал свой вопрос, но суть такова: Есть структура

202
Контент страницы показать на другой?

Контент страницы показать на другой?

Здравствуйте ! Помогите на html страницы выводить контент другой страницыIframe не катит, так как надо чтобы было еще кликабельно, а здесь получается...

373
Как изменить частоту звука в JS?

Как изменить частоту звука в JS?

Мне нужно, чтобы по исполнению функции аудио не только замедлялось, но и изменяло частоту звука

338