运算符 |= 在 JavaScript 中的作用是啥?

Posted

技术标签:

【中文标题】运算符 |= 在 JavaScript 中的作用是啥?【英文标题】:What does the operator |= do in JavaScript?运算符 |= 在 JavaScript 中的作用是什么? 【发布时间】:2012-10-03 00:11:32 【问题描述】:

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

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

|= 在 for 循环体中做了什么?

代码示例有问题,但已由 V8 提供 here 以作为提高性能的示例。

更新示例

对于大多数意图和目的,上面的示例等效于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

【问题讨论】:

我才意识到它来自这里的代码。 html5rocks.com/en/tutorials/speed/v8 @razpeitia 阅读了这个问题,你会发现那个 URL... 【参考方案1】:
x |= y;

等价于

x = x | y;

其中| 代表按位或

【讨论】:

有成语的意思吗?或者一些技巧,比如当你用~~ 向下浮动时? @katspaugh 有。例如,它可以用于有效的编码和权限检查(这也适合 OP 代码)。阅读this article。 @katspaugh 你说的“地板下浮着~~”是什么意思?我从来没有听说过这样的事情!【参考方案2】:

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

a |= b
a = a | b

就像

a += b
a = a + b

更多信息请关注Moz Dev Net。

[编辑:脑残,搞混了|和||。需要更多的咖啡。修改如下]

由于| 是按位或运算符,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)

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

【讨论】:

所以这和逻辑or一样?例如。 var a = "标题" || x 您混淆了逻辑或和按位或。 呸。按位或不是逻辑或。大脑是有趣的东西。现已修复。【参考方案3】:
a[0] |= b

基本上是

a[0] = a[0] | b

“|”是or bitwise operator

更新a[0] 被分配0 时,二进制中的a[0]0000。在循环中,

    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)
    

    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)
    

    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)
    

    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)
    

    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)
    

    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)
    

    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)
    

    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)
    

    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)
    

    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

【讨论】:

@user1638092 很高兴为您提供帮助 :) 为了明确起见,步骤 4、6、7、8 和 10 都是多余的,所以这个循环是性能提升的一个坏例子......【参考方案4】:

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

代码: 结果 = 一个 | b;

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

【讨论】:

以上是关于运算符 |= 在 JavaScript 中的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章

<<= 运算符在 javascript 中的作用是啥? [复制]

~~(“双波浪号”)在 Javascript 中的作用是啥?

javascript中的单加运算符[重复]

在 Javascript 中使用多个 = 运算符有啥作用? [复制]

JavaScript入门

为啥加号运算符在 JavaScript 的正则表达式中不起作用? [复制]