在js中,以前向下取整都是使用Math.floor方法,現在有看到這樣的用法:或運算 interval = interval | 0為什麼這樣就可以向下取整了,這種用法和Math.floor比較,有什麼好處?
认证高级PHP讲师
注意,| 不是邏輯或,而是按位或 (OR)。
|
一些小差別。例如 Math.floor(NaN) 還是回 NaN。但 NaN | 0 回傳 0。 再例如 Math.floor(Infinity) 回傳 Infinity,但 Infinity | 0 回傳 0
Math.floor(NaN)
NaN
NaN | 0
Math.floor(Infinity)
Infinity
Infinity | 0
你還可以這樣 interval = interval >> 0
interval = interval >> 0
首先樓上S1ngS1ng說那些小差別是對的。
另外,|是位或運算,由於0在內存中存儲的時候,是所有的整數位全部被填充了0,所以按二進制位和一個數值進行或運算,對應位上無論是0還是1和0進行或運算,都會得到它本身,但是由於數字0在內存中不存在小數部分,所以位或運算之後interval的小數部分被丟棄。其實是丟棄小數部分實現了向下取整。
0
1
interval
由於是位元運算,所以會比Math.floor()快。
Math.floor()
真實的原因是:js內部的型別自動轉換。
js的數值都是以64位元浮點型表示的。當一個數值需要進行位元運算時,js會自動將它轉換為32位元有符號整形,並捨棄小數部分。
64位元
位元運算
32位元有符號
n|0 ; n>>0 ; //後面的0 僅用來確保n的整數值不變而已。
從64位降到32位,是會有精度損失的。 小心! ,最大有效範圍: 2^32/2-1
小心!
> f64=(Math.pow( 2,32)/2-1)-0.5 2147483646.5 > f64|0 2147483646 > f64>>0 2147483646 > (f64 + 2)|0 //超出有效范围 -2147483648 > (f64 + 2)>>0 //超出有效范围 -2147483648 > Math.floor(f64 + 2) //正确 2147483648
兩種都可以實現, interval = interval | 0 這個是一個寫作的技巧,看個人愛好吧。可能就是interval = interval | 0這種寫法運行會快一點,寫程式碼這個也肯定比Math.floor寫得快!
interval = interval | 0
Math.floor
注意,
|
不是邏輯或,而是按位或 (OR)。一些小差別。例如
Math.floor(NaN)
還是回NaN
。但NaN | 0
回傳 0。再例如
Math.floor(Infinity)
回傳Infinity
,但Infinity | 0
回傳 0你還可以這樣
interval = interval >> 0
首先樓上S1ngS1ng說那些小差別是對的。
另外,
|
是位或運算,由於0
在內存中存儲的時候,是所有的整數位全部被填充了0,所以按二進制位和一個數值進行或運算,對應位上無論是0
還是1
和0
進行或運算,都會得到它本身,但是由於數字0在內存中不存在小數部分,所以位或運算之後interval
的小數部分被丟棄。其實是丟棄小數部分實現了向下取整。由於是位元運算,所以會比
Math.floor()
快。真實的原因是:js內部的型別自動轉換。
js的數值都是以
64位元
浮點型表示的。當一個數值需要進行位元運算
時,js會自動將它轉換為32位元有符號
整形,並捨棄小數部分。n|0 ; n>>0 ; //後面的0 僅用來確保n的整數值不變而已。
從64位降到32位,是會有精度損失的。
小心!
,最大有效範圍: 2^32/2-1兩種都可以實現,
interval = interval | 0
這個是一個寫作的技巧,看個人愛好吧。可能就是interval = interval | 0
這種寫法運行會快一點,寫程式碼這個也肯定比Math.floor
寫得快!