Почему (Бесконечность | 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,

Другие вопросы по тегам