Принуждение в 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 являются значениями, дает истину или ложь. Такое сравнение выполняется следующим образом:
Если тип (x) совпадает с типом (y), возвращает результат выполнения сравнения строгого равенства x === y.
Если x равно нулю, а y не определено, верните true.
Если x не определено, а y равно нулю, верните 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).
Если тип (x) равен объекту, а тип (y) равен либо строке, числу, либо символу, то возвращает результат сравнения ToPrimitive(x) == y.
Вернуть ложь.
Таким образом, вместо того, чтобы принуждать одну сторону, а затем другую, или что-то в этом роде, скорее, интерпретатор просматривает этот список выше, пока не найдет соответствующее условие, и не выполнит результирующую команду, которая может включать принуждение только левой стороны или только правая сторона (и, редко, оба, в случае достижения рекурсивной команды, например, с true == '1'
, которая выполнит условие 8, превратится в 1 == '1'
, выполняя условие 6 и превращаясь в 1 == 1
, выполнив условие 3 и приняв решение true
)