Побитовые операции с не номерами

Как-то JavaScript JavaScript понимает побитовые операции NaN ^ 1, Infinity ^ 1 и даже 'a' ^ 1 (все оцениваются как 1).

Каковы правила, управляющие побитовыми операторами для не чисел? Почему все приведенные выше примеры оцениваются в 1?

Ответ 1

В соответствии с спецификацией ES5 при выполнении побитовых операций все операнды преобразуются в ToInt32 (который сначала вызывает ToNumber. Если значение NaN или Infinity, оно преобразуется до 0).

Таким образом: NaN ^ 1 = > 0 XOR 1 = > 1

Ответ 2

ECMA-262 определяет в 11.10, что аргументы двоичных побитовых операторов преобразуются с помощью ToInt32. И 9.5, объясняющее ToInt32, говорит в первых двух его пунктах:

  • Пусть число будет результатом вызова ToNumber на входном аргументе.
  • Если число NaN, +0, -0, + Inf или -Inf, верните +0.