Как понять выражение "{} == true"?
Я пытаюсь понять выражение {} == true
после раздела 7.2.12
документа Ecma-262
.
- Если тип (y) булев, верните результат сравнения
x == ToNumber(y)
Результат ToNumber(true)
равен 1
, тогда
{} == 1
- Если Type (x) - это Object и Type (y), это либо String, Number, либо Symbol, тогда верните результат сравнения
ToPrimitive(x) == y
.
Теперь я запутался в ToPrimitive({})
.
-
Если подсказка "string", то
а. Пусть methodNames будет "toString", "valueOf" ".
-
Else
а. Пусть methodNames будет" "valueOf", "toString" ".
Если ToPrimitive({})
интерпретироваться как {}.toString()
или {}.valueOf()
?
Предположим, что вызывается toString()
.
Если Type (x) - String, а Type (y) - Number, верните результат сравнения ToNumber(x) == y
Итак, {} == true
может быть ToNumber(ToPrimitive({})) == ToNumber(true)
?
Ответы
Ответ 1
spec говорит:
Когда ToPrimitive
вызывается без подсказки, он обычно ведет себя так, как будто подсказка была Number.
Следовательно, согласно алгоритму ToPrimitive
, valueOf
вызывается первым. Но так как это возвращает объект, а не примитивное значение, toString
будет вызываться вторым, который возвращает строку.
Итак {} == true
может быть ToNumber(ToPrimitive({})) == ToNumber(true)
?
Да, это именно то, что есть.
Ответ 2
ToPrimitive({})
сначала оценивается до {}.valueOf()
. Поскольку valueOf()
возвращает сам объект, используется метод toString()
.
{}.toString()
возвращает "[object Object]"
, который сравнивается с 1
. "[object Object]"
преобразуется в число NaN
и сравнивается с 1
.
Теперь операнды - это тот же тип Number, и используется оператор ===. NaN === 1
оценивается как false
.
Формально:
-
{} == true
(преобразование true
в Number
→ 1
)
-
{} == 1
(transform {} с помощью valueOf()
, затем toString()
→ "[object Object]"
)
-
"[object Object]" == 1
(преобразуйте "[object Object]"
в Number
→ NaN
)
-
NaN == 1
(сменить оператор на ===
из-за того, что операнды одного типа)
-
NaN === 1
-
false
Обновление: Отметьте мое сообщение Легенда оператора JavaScript по обеспечению равенства с гораздо большим количеством деталей и примеров.