2012-10-12 60 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):