Почему (Бесконечность | 0) === 0? - PullRequest
23 голосов
/ 11 июля 2011

Я возился с побитовыми операторами в 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 ]

52 голосов
/ 11 июля 2011

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

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

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

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

2 голосов
/ 11 июля 2011

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

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

...