为什么javascript在某些条件下会忽略某行的执行?
Why does javascript ignore the execution of certain line under certain conditions?
今天我注意到 JavaScript 在某些条件下忽略了某些行的执行。
例如,正常人看了下面的代码,会认为value is false
应该记录5次。
const values = [false, false, false, false, false];
const isTrue = (value) => {
console.log(`value is ${value}`);
return !!value;
};
let isAllTrue = true;
values.forEach(value => {
isAllTrue &&= isTrue(value);
});
但是,这段代码记录了一次。
此代码表明,一旦 isAllTrue
为 false
,无论您做什么,isAllTrue
都不会因为 &&=
而成为 true
。
这就是为什么我认为函数执行被忽略了。
我认为这是 JavaScript.
的优化
我想知道确切的原因,所以我用谷歌搜索,但找不到具体说明。
如果您知道规格在哪里,请告诉我。
您正在见证 short-circuit evaluation。
首先,让我们打开 isAllTrue &&= isTrue(value)
使其更清晰一些。如果我们将此语句写成更长的形式,它将是 isAllTrue = isAllTrue && isTrue(value)
.
第一次迭代后,isAllTrue
将是false
,所以无论isTrue(value)
是什么return,isAllTrue && isTrue(value)
的结果总是false
。由于无需评估 isTrue(value)
即可知道结果,因此 JavaScript 将其优化掉甚至不调用它。
来自 &&
- LOGICAL AND 的文档:
The logical AND (&&) operator (logical conjunction) for a set of Boolean operands will be true if and only if all the operands are true. Otherwise it will be false.
更一般地说,运算符 returns 从左到右计算时遇到的第一个假操作数的值,或者如果它们都是真值,则最后一个操作数的值。
这基本上意味着 &&
之前的第一个表达式是否为假。第二个甚至从未达到过。这不是JS的优化。这就是操作员在编码语言中的工作方式。这正是您的代码正在发生的事情。函数只有运行一次。一旦isAllTrue的值为false
。它再也不会变成 true
今天我注意到 JavaScript 在某些条件下忽略了某些行的执行。
例如,正常人看了下面的代码,会认为value is false
应该记录5次。
const values = [false, false, false, false, false];
const isTrue = (value) => {
console.log(`value is ${value}`);
return !!value;
};
let isAllTrue = true;
values.forEach(value => {
isAllTrue &&= isTrue(value);
});
但是,这段代码记录了一次。
此代码表明,一旦 isAllTrue
为 false
,无论您做什么,isAllTrue
都不会因为 &&=
而成为 true
。
这就是为什么我认为函数执行被忽略了。
我认为这是 JavaScript.
我想知道确切的原因,所以我用谷歌搜索,但找不到具体说明。 如果您知道规格在哪里,请告诉我。
您正在见证 short-circuit evaluation。
首先,让我们打开 isAllTrue &&= isTrue(value)
使其更清晰一些。如果我们将此语句写成更长的形式,它将是 isAllTrue = isAllTrue && isTrue(value)
.
第一次迭代后,isAllTrue
将是false
,所以无论isTrue(value)
是什么return,isAllTrue && isTrue(value)
的结果总是false
。由于无需评估 isTrue(value)
即可知道结果,因此 JavaScript 将其优化掉甚至不调用它。
来自 &&
- LOGICAL AND 的文档:
The logical AND (&&) operator (logical conjunction) for a set of Boolean operands will be true if and only if all the operands are true. Otherwise it will be false.
更一般地说,运算符 returns 从左到右计算时遇到的第一个假操作数的值,或者如果它们都是真值,则最后一个操作数的值。
这基本上意味着 &&
之前的第一个表达式是否为假。第二个甚至从未达到过。这不是JS的优化。这就是操作员在编码语言中的工作方式。这正是您的代码正在发生的事情。函数只有运行一次。一旦isAllTrue的值为false
。它再也不会变成 true