52

我在一个 JS 项目中找到了以下代码:

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

for 循环体中的作用是什么|=

代码示例是可疑的,但 V8 已在此处提供了一个改进性能的示例。

更新示例

var a = [15];对于大多数意图和目的,上面的示例等效于。操作员更现实的示例是|=在单个变量中设置二进制标志,例如在权限对象上:

//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
}
4

4 回答 4

98
a[0] |= b

基本上是

a[0] = a[0] | b

“|” 是一个或位运算符

更新a[0]分配0a[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

于 2012-10-12T08:05:15.873 回答
52
x |= y;

相当于

x = x | y;

其中|代表按位或

于 2012-10-12T08:01:15.420 回答
8

与大多数赋值运算符一样,它等效于再次使用左侧值应用运算符:

a |= b
a = a | b

就像

a += b
a = a + b

查看Moz Dev Net了解更多信息。

[编辑:大脑失败,混淆| 和||。需要更多的咖啡。修改如下]

由于|是按位或运算符,因此 的结果a|b将是表示位串的整数,其中 和 的所有位为a1 b。请注意,javascript 没有本机 int 或 bitstring 类型,因此它将首先转换为 int,a然后b对位执行按位或。所以 9 | 二进制中的 2 是 1001 | 0010 = 1011,即 11,但 8|2 = 8。

效果是添加binto的标志位a。因此,如果您有一些标志WEEVILFLAG=parseInt(00001000,2)

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

将在 a 中将该位设置为 1。

于 2012-10-12T08:02:57.370 回答
5

在每个操作数的对应位为 1 的每个位位置返回一个 1。

代码:结果 = a | 乙;

^是按位 XOR 运算符,它在其操作数的相应位中的一个(而不是两个)为 1 的每个位置返回一个 1。下一个示例返回 4 (0100):

于 2012-10-12T13:32:40.623 回答