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