JavaScript是否会优化多个纯过滤器/地图/等?

时间:2019-04-14 22:55:42

标签: javascript performance compiler-optimization

我以功能样式编写了以下JavaScript代码:

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

现在,一个简单的实现会在数组上循环3次(每个filtermap一次),但是优化器应该能够将其优化到一个执行多个操作的循环。所有功能都是纯的。

(大多数?)JavaScript引擎会对此进行优化吗?还是需要手动优化?

编辑:我认为经过优化的只是将其减少到一个循环:

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

  return acc.push(doSomethingWithIt(element.property))
}, [ ])

2 个答案:

答案 0 :(得分: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;
});

答案 1 :(得分:0)

除非要在数组中添加filter,否则不能删除undefined调用-您可以使用解构将两个map调用合并为一个,但是:

someArray.filter(element => element).map(({ property }) => doSomething(property));