引用the Ecmascript 5 spec: 11.10 Binary Bitwise Operators,即
生產A : A @ B
,其中@
是 位運算符中的一個以上的製作(&
; ^
; |
),如下評價:
讓lref
是評估結果A.
讓lval
爲GetValue(lref)
。
讓rref
成爲評估B的結果。
讓rval
爲GetValue(rref)
。
讓lnum
爲ToInt32(lval)
。
讓rnum
爲ToInt32(rval)
。
將應用位運算符@的結果返回給lnum
和rnum
。結果是一個有符號的32位整數。
,並指出,ToInt32()
is defined as
讓number
是對輸入參數調用ToNumber
的結果。
如果號碼是NaN
,+0
,−0
,+∞
或−∞
,則返回+0
。
讓posInt
爲sign(number) * floor(abs(number))
。
讓int32bit
爲posInt
模2^32
;也就是Number
類型的有限整數值k
,其類型爲正符號且小於2^32
,使得posInt
和k
的數學差異在數學上爲2^32
的整數倍。
如果int32bit
大於或等於2^31
,則返回int32bit − 2^32
,否則返回int32bit
。
然後,它在邏輯如下(你可以在自己的控制檯確認)與例如
((Math.pow(2, 32)) + 2) | 0 === 2
(Math.pow(2, 31)) | 0 === -2147483648 === -(Math.pow(2, 31))
等等。
簡而言之,操作將數字轉換爲32位整數(具有它的訣竅,參見上面的第二個示例和ToInt32()
定義以獲得解釋),然後執行邏輯或具有零不變的操作輸出超出第一次轉換。
從本質上講,將數字轉換爲32位整數非常節省成本,因爲1)它依賴於瀏覽器內置的ToInt32()
;和2)ToInt32(0)
與0
短路(見上述規範),因此實際上不增加額外的開銷。
來源
2015-05-10 21:47:58
Nit
@RobG它不等同於'4.2'值。 – zerkms
這是asm.js風格。它將值強制爲32位整數,這比浮點快。 –
@RobG:而不是'3141592658'。 – Bergi