为什么在按位运算符执行相同操作时使用逻辑运算符?

Afs*_*ani 8 javascript operators bitwise-operators logical-operators

考虑这种情况:

(true & true & false & false & true) == true //returns: false
Run Code Online (Sandbox Code Playgroud)

如您所见,按位AND行为与逻辑AND完全相同:

(true && true && false && false && true) == true //returns: false
Run Code Online (Sandbox Code Playgroud)

我想知道为什么我应该在按位运算与逻辑运算相同时使用逻辑运算.

注意:请不要因为性能问题而回答这个问题,因为它在Mozilla Firefox中要快得多,请参阅此jsPerf:http://jsperf.com/bitwise-logical-and

Den*_*ret 21

使用逻辑运算符进行短路评估的最常见用途不是性能,而是避免错误.看到这个:

if (a && a.length)
Run Code Online (Sandbox Code Playgroud)

你不能简单地&在这里使用.

请注意,当您不处理布尔值时,使用&而不是&&无法完成.例如&on 2(01二进制)和4(10二进制)是0.

另请注意,除了if测试之外,还使用&&(就像||),因为它返回一个操作数:

"a" & "b" => 0
"a" && "b" => "b"
Run Code Online (Sandbox Code Playgroud)

更一般&地,&&通常可以使用代替.就像;在你的javascript代码中省略大多数一样.但它会迫使你思考超过必要的(或者会不时给你带来奇怪的错误).

  • [**懒惰评估**](http://en.wikipedia.org/wiki/Lazy_evaluation)通常具有比[**短路评估**]更广泛/不同的含义(http://en.wikipedia.组织/维基/短circuit_evaluation). (4认同)

Ber*_*rgi 11

按位运算行为相同?

不,这不对.按位运算符处理整数,而逻辑运算符具有不同的语义.仅在使用纯布尔时,结果可能类似.

  • 按位运算符:Evalutate两个操作数,转换为32位整数,对它们进行操作,然后返回数字.
  • 逻辑运算符:计算第一个操作数,如果它是truthy/falsy然后evalutate并返回第二个操作数,则返回第一个结果.这称为短路评估

您已经可以在结果类型中看到这种差异:

(true & true & false & false & true) === 0
(true && true && false && false && true) === false
Run Code Online (Sandbox Code Playgroud)


Sal*_*n A 8

不,他们不这样做.不同之处是:

  1. 是否转换了操作数类型
  2. 是否评估两个操作数
  3. 返回值
// sample functions 
function a() { console.log("a()"); return false; }
function b() { console.log("b()"); return true; }
Run Code Online (Sandbox Code Playgroud)

&&(逻辑AND)

  1. 检查操作数的真实性
  2. 使用短路并且可能不评估第二个操作数
  3. 返回没有类型转换的最后一个计算操作数
a() && b();
// LOG: "a()"
// RET: false
Run Code Online (Sandbox Code Playgroud)

&(按位AND)

  1. 暂时将操作数转换为32位整数表示(如有必要)
  2. 评估两个操作数
  3. 返回一个数字
a() & b();
// LOG: "a()"
// LOG: "b()"
// RET: 0
Run Code Online (Sandbox Code Playgroud)