javascript - 为什么javascript在某些条件下会忽略某些行的执行?

标签 javascript optimization

今天我注意到 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)返回什么,的结果>isAllTrue && isTrue(value) 将始终为 false。由于无需评估 isTrue(value) 即可知道结果,因此 JavaScript 会对其进行优化,甚至不会调用它。

关于javascript - 为什么javascript在某些条件下会忽略某些行的执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70505690/

相关文章:

mysql - 在 1 亿+ 字符串中有效地搜索存在 5000 次

javascript - 在辅助方法中 react i18next useTranslation Hook

javascript - 三.js服务器端碰撞检测错误

javascript - 无法在 Google Apps 脚本表中使用类方法

javascript - 循环遍历嵌套数组

Java压缩一些代码

c++ - 如何用Ceres解决大规模非线性优化问题?

javascript - Extjs 5 - 如何在 init 上添加路由

c++ - 手动填充顶点结构实现对齐

optimization - Varnish,具有提前退出功能的自定义子例程