为什么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);
});

但是,这段代码记录了一次。
此代码表明,一旦 isAllTruefalse,无论您做什么,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