是否优化了本机映射,过滤器等方法,以便在可能的情况下在单个中间阵列上运行?

时间:2016-09-09 08:55:46

标签: javascript arrays

考虑下面的片段,它将一个对象数组转换为数字数组,过滤掉负值,然后加倍2:

var objects = (new Array(400)).fill({
    value: Math.random() * 10 - 5
});

var positiveObjectValuesDoubled = objects.map(
    item => item.value
).filter(
    value => value > 0
).map(
    value => value * 2
);

当像这样链接在一起时,总共会创建多少个实际的Array对象? 1还是3? (不包括最初的objects数组)

特别是,我正在谈论由filter创建的中间Array对象,然后是链中的第二个map调用:考虑到这些数组对象本身没有明确引用, Javascript运行时是否足够智能,以便在这种情况下尽可能优化,使用相同的内存区域?

如果无法用明确的是或否回答这个问题,我怎样才能在各种浏览器中确定? (据我所知,the array constructor can no longer be overridden,因此不能选择)

1 个答案:

答案 0 :(得分:0)

到目前为止,评论很好,这是一个总结答案:引擎可能会优化链式方法调用的内存使用情况,但您不应指望引擎为您进行优化。

在评估链式方法的示例时,引擎的内存堆会以相同的顺序step by step (MDN documentation on the event loop)受到影响。但是,这是如何工作的可能取决于引擎...因为某些Array.map()可能会创建一个新数组并在下一个消息执行之前收集旧数组,它可能会留下旧数据,直到需要该空间为止再一次,它可能会改变阵列,无论如何。了解这一点的rabbithole是非常深刻的。

你能测试一下吗?有时! jQuery or javascript to find memory usage of pagethis Google documentation是开始的好地方。或者你可以用http://jsperf.com/这样的速度来看速度,这可能会让你至少知道空间昂贵的东西可能是多少。但您也可以利用这段时间在您自己的代码中进行直接优化。可能是一个更好的电话。