2012-10-12 93 views
29

我發現在JS項目下面的代碼:運算符| =在JavaScript中做什麼?

var a = new Array(); 
a[0] = 0; 
for (var b = 0; b < 10; b++) { 
    a[0] |= b; 
} 

什麼是|=做的for循環的身體?代碼示例是可疑的,但V8已經提供了here,以獲得改進性能的示例。

更新了例

上面的例子是相當於var a = [15];對於大多數的意圖和目的。爲|=運營商A更現實的例子是建立二進制標誌在一個單一的可變的,例如一個權限對象上:

//Set up permission masks 
var PERMISSION_1_MASK = parseInt('0001',2); 
var PERMISSION_2_MASK = parseInt('0010',2); 
.. 

//Set up permissions 
userPermissions = 0; 
userPermissions |= hasPermissionOne && PERMISSION_1_MASK; 
userPermissions |= hasPermissionTwo && PERMISSION_2_MASK; 
.. 

//Use permissions 
if(userPermissions & PERMISSION_1_MASK){ 
    ..//Do stuff only allowed by permission 1 
} 
+0

我剛剛意識到它是來自這裏的代碼。 http://www.html5rocks.com/en/tutorials/speed/v8/ – razpeitia

+2

@razpeitia閱讀這個問題,你會發現這個網址... – ContentiousMaximus

回答

70
a[0] |= b 

基本上

a[0] = a[0] | b 

「|」是or bitwise operator(順便說一下:該MDN文檔真的寫得很好,真的很清楚,如果OP是想編寫和理解JS,那麼MDN文檔是一個很好的資源)

更新a[0]被分配0,a[0]二進制是0000。在循環中,

  1. B = 0

    a[0] = 0 (base 10) = 0000 (base 2) 
    b = 0 (base 10) = 0000 (base 2) 
            --------------- 
    a[0] | b   = 0000 (base 2) = 0 (base 10) 
    
  2. B = 1

    a[0] = 0 (base 10) = 0000 (base 2) 
    b = 1 (base 10) = 0001 (base 2) 
            --------------- 
    a[0] | b   = 0001 (base 2) = 1 (base 10) 
    
  3. B = 2

    a[0] = 1 (base 10) = 0001 (base 2) 
    b = 2 (base 10) = 0010 (base 2) 
            --------------- 
    a[0] | b   = 0011 (base 2) = 3 (base 10) 
    
  4. B = 3

    a[0] = 3 (base 10) = 0011 (base 2) 
    b = 3 (base 10) = 0011 (base 2) 
            --------------- 
    a[0] | b   = 0011 (base 2) = 3 (base 10) 
    
  5. B = 4

    a[0] = 3 (base 10) = 0011 (base 2) 
    b = 4 (base 10) = 0100 (base 2) 
            --------------- 
    a[0] | b   = 0111 (base 2) = 7 (base 10) 
    
  6. B = 5

    a[0] = 7 (base 10) = 0111 (base 2) 
    b = 5 (base 10) = 0101 (base 2) 
            --------------- 
    a[0] | b   = 0111 (base 2) = 7 (base 10) 
    
  7. B = 6

    a[0] = 7 (base 10) = 0111 (base 2) 
    b = 6 (base 10) = 0110 (base 2) 
            --------------- 
    a[0] | b   = 0111 (base 2) = 7 (base 10) 
    
  8. B = 7

    a[0] = 7 (base 10) = 0111 (base 2) 
    b = 7 (base 10) = 0111 (base 2) 
            --------------- 
    a[0] | b   = 0111 (base 2) = 7 (base 10) 
    
  9. B = 8

    a[0] = 7 (base 10) = 0111 (base 2) 
    b = 8 (base 10) = 1000 (base 2) 
            --------------- 
    a[0] | b   = 1111 (base 2) = 15 (base 10) 
    
  10. B = 9

    a[0] = 15 (base 10) = 1111 (base 2) 
    b = 9 (base 10) = 1001 (base 2) 
            --------------- 
    a[0] | b   = 1111 (base 2) = 15 (base 10) 
    

在循環結束時的a[0]值爲15

+22

+1步進循環 – WildlyInaccurate

+0

@kidmenot:太棒了,謝謝。 – ContentiousMaximus

+0

@ user1638092很高興能夠提供幫助:) –

46
x |= y; 

相當於

x = x | y; 

其中|看臺對於按位或

+0

有沒有一個慣用的含義?或者是一些詭計,比如當你用'~~'平躺下來時? – katspaugh

+1

@ katspaugh有。例如,它可以用於高效編碼和特權檢查(這也適用於OP代碼)。閱讀[本文](http://www.php4every1.com/tutorials/create-permissions-using-bitwise-operators-in-php/)。 – freakish

+1

@ katspaugh你的意思是「樓下有~~漂浮」?我從來沒有聽說過這樣的事情! –

7

與大多數賦值運算符,它相當於再次使用左手值將運營商:

a |= b 
a = a | b 

就像更多關於Moz Dev Net

a += b 
a = a + b 

看。

[編輯:腦衰竭,混合起來|和||。需要更多的咖啡。下文]

改性由於|是按位或運算,的a|b結果將是表示與所有的ab 1位位串的整數。請注意,javascript沒有本地int或bitstring類型,所以它會首先將ab轉換爲int,然後對這些位執行按位或運算。所以9 | 2在二進制中是1001 | 0010 = 1011,即11,但8 | 2 = 8。

效果是將b的標誌位添加到a。所以,如果你有一些標誌WEEVILFLAG=parseInt(00001000,2)

// a = parseInt(01100001,2) 
if(isWeevilish(a)) 
    a |= WEEVILFLAG; 
// now a = parseInt(01101001,2) 

將該位設置爲1的。

+1

所以這是一樣的邏輯或?例如。 var a =「title」|| x – ContentiousMaximus

+3

您正在混淆邏輯OR和按位OR。 – katspaugh

+1

Bah。按位或不是邏輯或。大腦是有趣的事情。現在修復。 –

11

它的工作原理種像這樣:如果b大於a,b被添加到a

與其他運營商一樣,現實中發生的事情是a = a | b。 這意味着a = a BITWISE OR b這是解釋here

舉例來說,這是一些操作的結果:

var a = 1; 
a |= 2; // a = 3 
a |= 2; // a = 3 
a |= 4; // a = 7 

我希望幫助。

+0

不確定: b:0 a [0]:0 b:1 a [0]:1 b:2 a [0]:3 b:3 a [0]:3 b:4 a [0]:7 b:5 a [0]:7 b:6 a [0]:7 b:7 a [0]:7 b:8 a [0]:15 b:9 a [0]:15 – ContentiousMaximus

+0

這應該是一個正確的補充,儘管其他一些人已經更加徹底地解釋了它。 –

5

返回每個位的位置,其中一個或兩個操作數的相應位爲1。

代碼: result = a | b;

^是按位異或操作符,它爲每個位置返回一個,其中操作數的一個(不是兩個)相應位都是一個。下一個示例返回4(0100):