在javaScript中一起使用时如何设置AND和OR的优先级



我正在努力理解这段代码的解释。

function Test() {
var a = 0; var b = 0; var c = 0; var d = 0;
if (a++ && b-- || c++) {
console.log("if block")
} else {
console.log("else block")
}
console.log(b);
}
Test();

观察:当我们执行此代码时,"b"的值为0;而不是"-1"。我认为A&B是false,但当再次用c检查||时,它应该是true。但当我运行代码时,else块会执行。我正试图找到对此的解释。试着找出它,但没有发现任何帮助。

让我们取if语句并将其分解。

a++ && b-- || c++

使用++的操作顺序有两种变体:

  1. a++-返回a的值,然后增加1
  2. ++a-增加1,然后返回

因此,第一部分a++返回a,当用作布尔值时(因为这是一个if语句(,它将计算为false,然后它将a增加1。

现在需要注意的一件重要事情是JS存在短路:

如果语句的一部分返回一个"0";falsy";result,而语句的其余部分依赖于所述结果,则不会对表达式的后一部分进行求值。

举个例子:

if (1 === 0 && console.log('test')) { 
// ...
}

您会注意到console.log从不启动。这是因为&&创建了一个隐式条件,其中后一部分不需要求值,因为它之前的条件被解析为false

现在我们知道了这一点,我们可以看到为什么else被激发,以及为什么表达式的其余部分没有求值(因此,将b保留为0(。

  1. a++-A返回为0,在此上下文中为false,并且if语句立即失败,从而落入else语句
  2. b--c++从未被评估,因为它是短路的
  3. 因此,bc保持为0。您可以测试a确实是1,但if语句还没有意识到这一点

如果您稍微更改代码。。。

if (++a && --b || ++c) {

您将看到您确实落在了if statement日志中,而不是else日志中。

这是因为:

  1. ++a将计算为1,即truthy
  2. --b将计算为-1,这也是truthy
  3. 由于前一个是真的,所以没有必要检查它后面的or,因为该条件已经满了

a将为1,b将为-1,c将保持为0。

function Test() {
let a = 0, b = 0, c = 0, d = 0;
if (++a && --b || ++c) {
console.log("if block")
} else {
console.log("else block")
}
console.log({ a, b, c });
}
Test();

最新更新