Подтвердить что ты не робот

Как понять выражение "{} == true"?

Я пытаюсь понять выражение {} == true после раздела 7.2.12 документа Ecma-262.

  1. Если тип (y) булев, верните результат сравнения x == ToNumber(y)

Результат ToNumber(true) равен 1, тогда

{} == 1

  1. Если Type (x) - это Object и Type (y), это либо String, Number, либо Symbol, тогда верните результат сравнения ToPrimitive(x) == y.

Теперь я запутался в ToPrimitive({}).

  1. Если подсказка "string", то

    а. Пусть methodNames будет "toString", "valueOf" ".

  2. Else

    а. Пусть methodNames будет" "valueOf", "toString" ".

Если ToPrimitive({}) интерпретироваться как {}.toString() или {}.valueOf()?

Предположим, что вызывается toString().

Если Type (x) - String, а Type (y) - Number, верните результат сравнения ToNumber(x) == y

Итак, {} == true может быть ToNumber(ToPrimitive({})) == ToNumber(true)?

4b9b3361

Ответ 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 в Number1)
  • {} == 1 (transform {} с помощью valueOf(), затем toString()"[object Object]")
  • "[object Object]" == 1 (преобразуйте "[object Object]" в NumberNaN)
  • NaN == 1 (сменить оператор на === из-за того, что операнды одного типа)
  • NaN === 1
  • false

Обновление: Отметьте мое сообщение Легенда оператора JavaScript по обеспечению равенства с гораздо большим количеством деталей и примеров.