Побитовые операции с не номерами
Как-то 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.