Почему (Бесконечность | 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
не должен ничего делать?
2 ответа
Битовые операторы работают только с целыми числами.Infinity
является значением с плавающей точкой, а не целым числом.
В спецификации сказано, что все операнды побитовых операций перед выполнением операции преобразуются в целые числа (с использованием операции ToInt32).
Операция ToInt32 говорит:
Если число равно NaN, +0, −0, +∞ или –∞, верните +0.
Выполнение математических и других операций, ожидающих целые числа с NaN
а также Infinity
обычно плохая идея. Как бы вы установили / очистили немного от Infinity?
На самом деле побитовые операции определяются только для целых чисел, а целые не имеют NaN
или же Infinity
,