我正在努力理解这段代码的解释。
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++
使用++
的操作顺序有两种变体:
a++
-返回a的值,然后增加1++a
-增加1,然后返回
因此,第一部分a++
返回a
,当用作布尔值时(因为这是一个if
语句(,它将计算为false
,然后它将a
增加1。
现在需要注意的一件重要事情是JS存在短路:
如果语句的一部分返回一个"0";falsy";result,而语句的其余部分依赖于所述结果,则不会对表达式的后一部分进行求值。
举个例子:
if (1 === 0 && console.log('test')) {
// ...
}
您会注意到console.log
从不启动。这是因为&&
创建了一个隐式条件,其中后一部分不需要求值,因为它之前的条件被解析为false
。
现在我们知道了这一点,我们可以看到为什么else
被激发,以及为什么表达式的其余部分没有求值(因此,将b
保留为0(。
a++
-A返回为0
,在此上下文中为false
,并且if
语句立即失败,从而落入else
语句b--
和c++
从未被评估,因为它是短路的- 因此,
b
和c
保持为0
。您可以测试a
确实是1
,但if
语句还没有意识到这一点
如果您稍微更改代码。。。
if (++a && --b || ++c) {
您将看到您确实落在了if statement
日志中,而不是else
日志中。
这是因为:
++a
将计算为1,即truthy
--b
将计算为-1,这也是truthy
- 由于前一个是真的,所以没有必要检查它后面的
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();