2011-10-10 131 views
72

我看到其他StackOverflow post這句法和很好奇它做什麼:JavaScript的三倍大於

var len = this.length >>> 0;

是什麼>>>意味着什麼呢?

+1

這是一個右移操作符,但爲什麼你會右移零?這是一種'parseInt'的廉價方式嗎? –

+3

'>>>'總是將符號位設置爲零,即使您移位了零位。 –

+4

檢查這個答案關於*爲什麼他們在這種情況下使用'>>>'操作符:http://stackoverflow.com/questions/3081987/what-good-does-zero-fill-bit-shifting-by-0 -do-a-0/3082073#3082073 – CMS

回答

44

這是一個unsigned right shift operator。有趣的是,它是唯一的bitwise operator,它是在JavaScript中的無符號的

>>>運算符將expression1的位右移表達式2中指定的 位的位數。零點從左側填充。 丟棄右移的位數。

3

>>>是一個按位運算符,zero-fill right shift

我認爲>>> 0對正數的唯一影響是舍入到最接近的整數,與Math.floor()相同。我不明白爲什麼在你的例子中這將是必要的,因爲通常.length屬性(例如Array)已經是一個整數。

我也看到了略短於~~的用法:~~9.5 == 9; // true

+0

我懷疑它是否與用於負數的Math.abs()相同。 –

+6

如果你在負數上做'>>> 0',它將它轉換成2的恭維,然後進行右移。因此'-14 >>> 0 == 1073741820'。(http://msdn.microsoft.com/en-us/library/342xfs5s%28v=vs.94%29.aspx) –

+0

@AlKepp - 燁,我看到了錯誤,並修復它 - 應該先測試,但這顯然是一個快速繪製的問題:)。 – nrabinowitz

6

該運算符是一個邏輯右移。這裏的數字是移位0位。數學上的零位移位應該沒有效果。

但是在這裏它用於將值轉換爲無符號的32位整數。

90

忽視了其本意,這是最有可能在那裏你會看到它使用:


>>> 0的獨特之處在於它是將任何類型轉換爲正整數的唯一運營商:

"string"   >>> 0 == 0 
(function() { }) >>> 0 == 0 
[1, 2, 3]  >>> 0 == 0 
Math.PI   >>> 0 == 3 

在你的榜樣,var len = this.length >>> 0,這是得到一個整數長度使用遍歷this,無論何種類型this.length可能的一種方式。


同樣,~~x可用於任何可變轉換爲符號整數。

+0

你能解釋如何使用'>>>'來迭代嗎? – K48

+1

@ K48我不認爲他的意思是* iterate *,我認爲他的意思是說這會迫使其成爲一個數字。 (否則,我同樣困惑。)但這是一個很好的答案,闡明更多:https://stackoverflow.com/questions/1822350/what-is-the-javascript-operator-and-how-do-you-use-它 –