JavaScript是否优化了多个纯滤镜/贴图/等?

问题描述 投票:3回答:2

我有这个用函数风格编写的JavaScript代码:

someArray
  .filter((element) => element)
  .map((element) => element.property)
  .map((property) => doSomethingWithIt)

现在,一个天真的实现将循环遍历数组三次 - 每个filtermap - 但优化器应该能够优化它到一个循环执行多个操作,假设所有函数都是纯的。

做(大多数?)JavaScript引擎优化了这一点;还是需要手动优化?

编辑:我想到的优化是将它减少到一个循环:

someArray.reduce((acc, element) => {
  if(!element) {
    return acc
  }

  return acc.push(doSomethingWithIt(element.property))
}, [ ])
javascript performance compiler-optimization
2个回答
4
投票

优化器应该能够将其优化为执行多个操作的一个循环。

不,它不应该!此优化可能会更改代码的行为。

考虑一个双map,其中每个map的操作有可观察到的副作用:

let arr = [1, 2, 3];
arr.map((x) => { console.log("foo", x); return x })
   .map((y) => { console.log("bar", y); return y });

从“优化”版本记录不同的消息序列:

let arr = [1, 2, 3];
arr.map((x) => {
    console.log("foo", x);
    console.log("bar", x);
    return x;
});

0
投票

你不能删除filter调用,除非你想在你的数组中使用undefined - 你可以使用解构将两个map调用为一个,但是:

someArray.filter(element => element).map(({ property }) => doSomething(property));
© www.soinside.com 2019 - 2024. All rights reserved.