为什么 ( Infinity | 0 ) === 0?

23

我在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又不应该有任何影响呢?


你如何计算 (infinity | 0)?无穷大是...无限的,根据其定义,它不能被计算... :| - Albireo
3
因为计算机必须以某种方式表示无限,但它只有有限数量的比特可用。 - Dylan
1
这真的很有趣,因为当您在if-else语句中使用Infinity时,它似乎是一个真值,就像您所期望的那样。我刚刚确认了这一点:http://jsfiddle.net/LWBVd/。也许这与`Infinity`的内部表示有关。 - FishBasketGordo
@FishBasketGordo:看了一下答案,似乎值首先被转换为整数。就像 0.1 是真值一样,0.1 | 0 是假值。 - pimvdb
2个回答

52

按位运算符仅适用于整数。
Infinity是一个浮点数,而不是一个整数。

规范指出在执行按位运算之前,所有操作数都会被转换为整数(使用ToInt32操作)。

ToInt32操作的定义如下:

如果number为NaN、+0、-0、+∞或-∞,则返回+0。


2

使用 NaNInfinity 进行期望整数的数学运算和其他操作通常是不明智的。那么,您如何从 Infinity 中设置/清除一个比特?

实际上,位运算只对整数定义 - 而整数没有 NaNInfinity


1
жҲ‘и®ӨдёәInfinityдјҡиЎЁзӨәж— йҷҗж•°йҮҸзҡ„иҝһз»ӯзҡ„1жҜ”зү№гҖӮ - pimvdb
这更像是-1而不是无穷大(因为在像Python这样具有任意大小整数的语言中,-1的行为就是如此,而JavaScript只有32位整数。) - Random832
@Random832:我想我想得太简单了。我的想法是,就像11111116一样,111...111最终会变成无穷大。 - pimvdb
1111二进制是15。如果你遵循这条推理线,无限值将占据内存中的每一位,仍然无法准确地描绘无限大。 - dbasnett
@dbasnett:确实是15,我的愚蠢。我一直以为它会表示无限数量的1,所以Infinity | 0 === 111...111 | 0 === 111...111 === Infinity。但没关系,事实并非如此 :) - pimvdb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接