23

我在摆弄JavaScript中的按位运算符,有一件事我觉得非凡。为什么(Infinity | 0)=== 0?

如果两个输入位之一是1,则bitwise or operator返回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不应该做任何事情?

+0

你怎么计算'(infinity | 0)'?无限......是无限的,它不能通过它的定义来计算......:| – Albireo

+3

@Albireo - 因为计算机必须以某种方式表示无穷大,并且它只有有限的几个位来完成它。 – Dylan

+1

这真的很有趣,因为当你在if-else语句中使用它时,'Infinity'似乎是一个真值,就像人们所期望的那样。我只是证实了这一点:http://jsfiddle.net/LWBVd/。也许它与'Infinity'的内部表示有关。 – FishBasketGordo

回答

51

按位运算符仅对整数有效。
Infinity是一个浮点值,不是整数。

规范says在执行操作之前,将按位操作的所有操作数转换为整数(使用ToInt32操作)。

ToInt32 operation说:

如果数是NaN,+ 0,-0,+∞,-∞返回+ 0。

2

做数学和其他操作,期望整数与NaNInfinity通常是一个坏主意。你将如何设置/清除Infinity

实际上,按位操作只定义为整数 - 整数没有NaNInfinity

+0

我在想'Infinity'会代表无限多的'1'位。 – pimvdb

+0

这更像是-1而不是无穷大(因为这是-1在像Python这样具有任意大小整数的语言中的行为 - JavaScript只有32位整数) – Random832

+0

@ Random832:我想我太想太简单了。我的想法是,就像'1'是'1','1111'是'16','111 ... 111'将会结束到Infinity。 – pimvdb