Принуждение в JavaScript

Мне было интересно несколько вещей о принуждении.

Когда вы делаете:

1 == true // true

Какой из них принужден в какой? это левый или правый?

Когда вы делаете

undefined == null // true

Как это работает точно? В каком порядке он пытается конвертировать его? По экземпляру:

1)    String(undefined) == String(null) // false
2)    Number(undefined) == Number(null) // false
3)    Boolean(undefined) == Boolean(null) // true

Сначала он пытается привести левый операнд? тогда правильно? тогда оба?

РЕДАКТИРОВАТЬ: Как объяснено в комментариях: "не дубликат. В то время как оба вопроса касаются приведения типов, этот спрашивает, какой операнд приведен к другому. Другой вопрос об источнике истины при оценке приведенных типов"

1 ответ

Решение

Процесс описан в 7.2.12 Сравнение абстрактного равенства:

Сравнение x == y, где x и y являются значениями, дает истину или ложь. Такое сравнение выполняется следующим образом:

  1. Если тип (x) совпадает с типом (y), возвращает результат выполнения сравнения строгого равенства x === y.

  2. Если x равно нулю, а y не определено, верните true.

  3. Если x не определено, а y равно нулю, верните 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. Если тип (x) равен объекту, а тип (y) равен либо строке, числу, либо символу, то возвращает результат сравнения ToPrimitive(x) == y.

  10. Вернуть ложь.

Таким образом, вместо того, чтобы принуждать одну сторону, а затем другую, или что-то в этом роде, скорее, интерпретатор просматривает этот список выше, пока не найдет соответствующее условие, и не выполнит результирующую команду, которая может включать принуждение только левой стороны или только правая сторона (и, редко, оба, в случае достижения рекурсивной команды, например, с true == '1', которая выполнит условие 8, превратится в 1 == '1', выполняя условие 6 и превращаясь в 1 == 1, выполнив условие 3 и приняв решение true)

Другие вопросы по тегам