2011-04-21 44 views
15

以下函數旨在實現IE中的indexOf屬性。如果你曾經這樣做過,我相信你以前見過。奇怪的javascript運算符:expr >>> 0

if (!Array.prototype.indexOf){ 

    Array.prototype.indexOf = function(elt, from){ 

    var len = this.length >>> 0; 
    var from = Number(arguments[1]) || 0; 

    from = (from < 0) 
     ? Math.ceil(from) 
     : Math.floor(from); 

    if (from < 0) 
     from += len; 

    for (; from < len; from++){ 
     if (from in this &&  
      this[from] === elt) 
     return from; 
    } 

    return -1;  
    }; 
} 

我想知道如果使用三個大於符號的作爲作者在初始長度檢查中所做的常見嗎?

var len = this.length >>> 0

在控制檯這樣做只是返回我傳遞給它,而不是真或假的對象,這給我留下回味的語法爲目的的長度。這是一些我不知道的高級JavaScript忍者技術嗎?如果是這樣,請賜教!

回答

18

來源:LINK

這是零填充右移 算子移動的第一操作數的二進制表示 通過由第二操作數指定的地方 數 的權利。向右移位的位 被丟棄 ,零位被添加到左邊。 隨着一個正數,你會得到 相同的結果與 符號傳播向右移位運算符, 但負數失去他們的標誌 成爲積極的,因爲在接下來的 例子,它(假設「A」是 - 13)將返回1073741820:

代碼:

result = a >>> b; 
+0

哇,我waaaaay關閉:)謝謝先生,我已開悟,你得到的剔。 – Hacknightly 2011-04-21 16:46:34

+0

兩秒太慢。 Grats! – 2011-04-21 16:47:35

+2

那麼在例子'var len = this.length >>> 0'中究竟是什麼效果呢?這似乎什麼都不做。 – 2011-04-21 16:49:00

8

>>>(右移位)二進制運算符被簡單地移位數的最右邊的位的指定的次數,以及填充用零到左側。

注意:在下面的示例中,數字後的括號中的數字表示它所在的基數。2表示二進制,10表示十進制。

例如,4 >>> 1會做:

4(10) = 100(2) 

4(10) >>> 1(10) = 010(2) = 2(10) 
     shift once to the right 

其他例子:

4(10) >>> 2(10) = 100(2) >>> 2(10) = 001(2) = 1(10) 

10(10) >>> 4(10) = 1010(2) >>> 4(10) = 0000(2) = 0(10) 

15(10) >>> 1(10) = 1111(2) >>> 1(10) = 0111(2) = 7 

我記得那是位的必要量向右移動,然後寫數的方法。就像在最後一個例子中,我只是將一切都向右移動一次,所以結果是0111.

移動0次沒有...沒有。不知道爲什麼它在那裏。

+0

非常好的答案先生! +1 – Hacknightly 2011-04-21 16:55:55

8

>>>Zero-fill right shift運營商。如已經確定的那樣:

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

它還提到here在於:

位運算符對待它們的操作數爲32個比特(零 和1),而不是作爲十進制,十六進制或八進制數的序列。 [...]按位運算符對這種二進制 表示執行操作,但它們返回標準的JavaScript數值。

總之,這些語句斷言expr >>> 0將總是返回一個正數如下:

  1. expr被轉換爲一個32位整數,用於位運算
  2. >>> 0沒有效果(沒有位)
  3. 結果轉換爲Number

這裏有一些表情和他們的結局:

 1 >>> 0 // 1 -- Number cast to 32-bit integer then back to Number 
     "1" >>> 0 // 1 -- String cast to 32-bit integer then back to Number 
undefined >>> 0 // 0 -- failed cast yields zero 

其他有趣的情況:

 1.1 >>> 0 // 1   -- decimal portion gets it 
     -1 >>> 0 // 4294967295 -- -1 = 0xFFFFFFFF 
       //    Number(0xFFFFFFFF) = 4294967295 
     "A" >>> 0 // 0   -- cast failed 
    "1e2" >>> 0 // 100  -- 1x10^2 is 100 
    "1e10" >>> 0 // 1410065408 -- 1x10^10 is 10000000000 
       //    10000000000 is 0x00000002540BE400 
       //    32 bits of that number is 0x540BE400 
       //    Number(0x540BE400) is 1410065408 

注意:你會發現,他們沒有返回NaN