为什么JavaScript允许&& amp; (逻辑的)和& (按位)在条件语句中?

时间:2012-11-19 09:22:20

标签: javascript conditional logical-operators

我最近发现了一条javascript正在评估null / undefined,如下所示:

// The single & is on purpose!
if(x !== null & x !== undefined) {
    // Do this...
}

这对我来说看起来非常糟糕,但似乎有用。

据我所知,这些操作符应该执行两个不同的任务:

var x = 3; x &= 6; // No syntax errors.

var x = 3; x &&= 6; // Syntax error.

if(x == null && x == undefined) // No syntax errors.

if(x == null & x == undefined) // No syntax errors, but wrong operator usage?

有人可以对此有所了解吗?

3 个答案:

答案 0 :(得分:8)

当像这样使用时,运算符&&&都作为逻辑运算符工作(即使&运算符实际上不是逻辑运算符)。实际差异在于&&使用short circuit evaluation,而&则不然。

使用&运算符没有问题,只要可以计算第二个操作数,即使第一个操作数的计算结果为false。

当第一个操作数确定第二个操作数是否可以计算时,&&运算符可用于保持第二个操作数不被计算。例如:

if (x != null && x.prop == 42) { ... }

这比检查一个,然后另一个更短:

if (x != null) {
  if (x.prop == 42) { ... }
}

没有&&=运算符,因为在这种情况下使用短路评估没有意义。

答案 1 :(得分:1)

expr1 & expr2强制转换两个参数都转换为整数,然后计算它们的按位AND。如果是布尔值,则结果为01(非falsetrue)。零是假的,一个是真的,但仍然存在差异,因为两个参数总是被评估。

如果它是假的,则

expr1 && expr2返回expr1,否则它会评估并返回expr2。如果Expr2是假的,则不会评估expr1

答案 2 :(得分:0)

在条件下使用二进制操作可能是有益的。

E.g。没有逻辑'XOR'运算符,而是二进制运算符:

if(cond1 ^ cond2){//如果一条且只有一条条件成立,则执行某项操作}

应用于布尔值的二元运算符将表达式计算为整数(为0或1),其中二进制运算有效且定义良好。

二进制操作也保证评估所有子表达式,其中&&短路也会在表达式为假时停止评估。了解差异可以为问题选择最佳实践。

还有一个问题,为什么JavaScript允许字符串或对象进行比较:

if ("foo") { // is true }
if ("false") { // is also true }
if (null) { // is false }