2012-02-20 123 views
5

這是什麼:這條線是幹什麼的? arr.length >>> 0

arr.length >>> 0 

,我爲什麼要要使用它?

+0

另外我需要幫助標籤添加該運算符的名稱,因爲我不知道它的名字 – mithril333221 2012-02-20 23:48:13

+0

上下文是國王...給我們一些。 – jondavidjohn 2012-02-20 23:49:37

+3

我通常不喜歡在問題中編輯代碼,但我相當確定你的意思是「長度」而不是「長度」。 – 2012-02-20 23:49:40

回答

8

這是未經簽名的右移運算符。在這種情況下(與0一起使用時)它確保arr.length是一個整數,或者更確切地說,其值爲arr.length,爲嚴格無符號的32位整數值。 (這意味着它永遠不會NaN,從不爲負,且從未有一個小數部分。)

例子:

'1'  >>> 0: 1 
1   >>> 0: 1 
''  >>> 0: 0 
undefined >>> 0: 0 
null  >>> 0: 0 
1.0∙∙∙01 >>> 0: 1 

對比:

Number('1')  : 1 
Number(1)  : 1 
Number('')  : 0 
Number(undefined): NaN 
Number(null)  : 0 
Number(1.0∙∙∙01) : 1.0∙∙∙01 

這只是爲了確保正確的長度正在使用。

5

確保.length是一個32位整數。

在大多數實現中,陣列索引被限制爲32位的範圍(至少Array.prototype方法以及.length魔行爲工作時)。

+2

您錯過了......爲什麼我要使用它?唯一可能考慮的情況是* length *可能被設置爲非整數值。但是在符合ECMA-262的實現中,[不會發生](http://es5.github.com/#x15.4.5.1)。長度**總是**是一個非負整數。所以答案是:**從不**。 – RobG 2012-02-21 00:28:12

+0

我不會說「從不」。如果您正在爲標準'Array.prototype'方法編寫一個墊片,並試圖使其符合ECMA-262標準(或儘可能接近),則會使用它,因爲標準方法執行* ToUint32(lenVal)*轉換。此外,該規範允許將'Array.prototype'方法應用於「類似數組」的對象。這將爲墊片強制執行正確的「.length」值提供動力。 – 2012-02-21 00:34:31

+0

如果是這樣的話,那麼-ve值需要首先處理,因爲>>>對這些值有很大的影響。它將長度的大小限制爲比內置* array.length *少的長度,所以這是確保或將值轉換爲非負整數的糟糕方法。 – RobG 2012-02-21 01:16:49

相關問題