Почему (Infinity | 0) === 0?
Я работаю с побитовыми операторами в JavaScript, и есть одна вещь, которую я считаю замечательной.
побитовый или оператор возвращает 1
в качестве выходного бита, если один из двух входных битов 1
. Поэтому x | 0
всегда возвращает x
, потому что | 0
не имеет эффекта:
-
( 1 | 0 ) === 1
-
( 0 | 0 ) === 0
Однако, когда я вычислил Infinity | 0
, я получил 0
. Это, на мой взгляд, удивительно, потому что вышеизложенным следует получить Infinity
. В конце концов, ( x | 0 ) === x
.
Я не могу найти, где в спецификации ECMAscript это явно определено, поэтому мне было интересно, что именно подразумевает, что ( Infinity | 0 ) === 0
. Возможно ли, что Infinity
хранится в памяти? Если да, то как может быть, что выполнение операции | 0
приводит к возврату 0
, тогда как | 0
ничего не должно делать?
Ответы
Ответ 1
Побитовые операторы работают только с целыми числами.
Infinity
- это значение с плавающей запятой, а не целое число.
В спецификации указано, что все операнды побитовых операций преобразуются в целые числа (используя операцию ToInt32) перед выполнением операции.
Операция ToInt32 говорит:
Если число NaN, +0, -0, + ∞ или -∞ возвращает +0.
Ответ 2
Выполнение математических и других операций, которые ожидают целые числа с NaN
и Infinity
, как правило, является плохой идеей. Как бы вы установили/очистили бит от бесконечности?
Собственно, битовые операции определены только для целых чисел, а целые числа не имеют NaN
или Infinity
.