为何JavaScript中Bitwise OR运算符左侧为1时仍会计算两侧?
为什么Bitwise OR会计算两侧表达式?
先明确Bitwise OR的定义:
当两个操作数对应位均为0时,该位返回0,否则返回1。本质上意味着
1 | 0的结果为1。
它的行为和||(逻辑或)有点相似——只要一侧为“真”就返回对应结果,但二者有个核心差异:逻辑或具备短路求值特性,如果左侧表达式已经能确定整个结果为真,就不会再去计算右侧表达式,毕竟结果已经板上钉钉了。
比如这个典型例子:
var a = 0, b = 0; function incrementAAndReturnTrue(){ a++; return true; } function incrementBAndReturnFalse(){ b++; return false; } incrementAAndReturnTrue() || incrementBAndReturnFalse(); console.log(a); // 1 console.log(b); // 0
这里左边函数返回true,逻辑或直接判定整体结果为真,根本没去调用右边的函数,所以b的值保持为0。
那为什么Bitwise OR会让你的b变成1呢?原因很简单:
位运算的本质是对两个操作数的二进制位做逐位操作,它必须先拿到左右两侧完整的运算结果,才能进行后续的位计算。
就像你给出的测试代码:
var a = 0, b = 0; function incrementAAndReturnOne(){ a++; return 1; } function incrementBAndReturnTwo(){ b++; return 0; } incrementAAndReturnOne() | incrementBAndReturnTwo(); console.log(a); // 1 console.log(b); // 实际为1,不是预期的0
不管左边返回的是什么,Bitwise OR都需要先把右边表达式的结果算出来,拿到它的二进制值,才能和左边的二进制位做逐位或运算。哪怕左边已经是1(二进制0b1),它还是得调用右边的函数,拿到返回值0,再计算1 | 0得到最终结果1。这就导致b被执行了自增操作,变成了1。
总结来说:逻辑或||是逻辑判断优先,能提前确定结果就停止计算;而Bitwise OR是位运算优先,必须拿到两个操作数的完整值才能进行运算,所以一定会执行两侧的表达式。
内容的提问来源于stack exchange,提问作者Adelin
相关产品推荐
相关产品推荐

