2015-07-10 92 views
5

我只是在瀏覽Mozilla開發者文檔,發現表示我不知道用於什麼,也無法通過互聯網找到任何信息。「>>>」運算符 - 用於什麼?

Array filter polyfill - line 10

var t = Object(this); 
var len = t.length >>> 0; 

任何建議,這是什麼運營商是?

+0

它是[按位運算符](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators)。 – Danny

回答

4

TL; DR

t.length >>> 0; 

實際上是嘗試從t.length獲得一個有效的32位無符號整數。我們知道,t.length可以是任何類型(對象,數組,字符串等)。如果它已經是一個有效的32位無符號數,則>>> 0返回值不變。例如,

console.log({} >>> 0); 
// 0 
console.log([] >>> 0); 
// 0 
console.log("Google" >>> 0); 
// 0 

通常情況下,按位伎倆來避免if塊類型檢查,這樣

var len = 0; 
if (typeof data === 'number') { 
    len = data; 
} 

我們可能還是要len轉換爲整數,如果它是浮動點值。

說明

>>>被稱爲填零右移位運算符。除用作位運算符外,還用於從對象中獲取32位數值。該ECMA Script 5.1 Specification for >>>

  1. LREF是評估ShiftExpression的結果。
  2. lval成爲GetValue(lref)。
  3. rref是評估結果添加劑表達
  4. rval成爲GetValue(rref)。
  5. lnum是ToUint32(lval)。
  6. rnum是ToUint32(rval)。
  7. shiftCount轉換是屏蔽掉所有的結果,但RNUM的至少顯著5位,也就是計算RNUM & 0x1F的。
  8. 返回執行零填充右移的結果lnumshiftCount位。空位填充零。 結果是一個無符號的32位整數。

它基本上轉換兩個操作數以32位無符號整數(步驟5和6)和轉移的左手側表達,右手側表達倍。

如果我們看一下definition of ToInt32

  1. 是調用ToNumber對輸入參數的結果。
  2. 如果數字是NaN,+ 0,-0,+∞或-∞,則返回+0。
  3. POSINT是符號()*地板(ABS())。
  4. int32bitPOSINT模2 ;即,有限整數值數字類型的ķ用正號和小於2 在幅度使得POSINTķ數學差是數學上的2 的整數倍。
  5. 返回int32bit

首先參數被轉換爲一個數字(如果它是一個不是有效的數字然後NaN將由ToNumber被返回)。第4步確保您返回的範圍爲0到2的有效數字。

+2

_ *向上級答案弓* 1(看來狗在這個問題上至高無上;-)) – Cerbrus

+0

現在它非常清楚!謝謝!順便說一句,這似乎是JS忍者求職面試非常好的問題:) – kuba

+1

@kuba:我不認爲有人可以期望開發人員知道這一點。但是,通過文檔可訪問... – Cerbrus

4

這是一個"Zero-fill right shift"(按位)運算符。

該運算符將第一個操作數向右移動指定的位數。向右移位的過多位被丟棄。零位從左側移入。符號位變成0,所以結果總是非負的。

對於非負數,零填充右移和符號傳播右移產生相同的結果。例如,9 >>> 2收益率爲2,與9 >> 2相同:

但是,負數不是這種情況。例如,-9 >>> 21073741821產生,這比-9 >> 2不同(其產生-3):

@thefourtheyeanswered with a good explanation關於此操作符的使用。