Подтвердить что ты не робот

Почему (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 ничего не должно делать?

4b9b3361

Ответ 1

Побитовые операторы работают только с целыми числами.
Infinity - это значение с плавающей запятой, а не целое число.

В спецификации указано, что все операнды побитовых операций преобразуются в целые числа (используя операцию ToInt32) перед выполнением операции.

Операция ToInt32 говорит:

Если число NaN, +0, -0, + ∞ или -∞ возвращает +0.

Ответ 2

Выполнение математических и других операций, которые ожидают целые числа с NaN и Infinity, как правило, является плохой идеей. Как бы вы установили/очистили бит от бесконечности?

Собственно, битовые операции определены только для целых чисел, а целые числа не имеют NaN или Infinity.