javascript – 原生地图,过滤器等方法是否已经优化,以便在可能的情况下在单个中间阵列上运行?

前端之家收集整理的这篇文章主要介绍了javascript – 原生地图,过滤器等方法是否已经优化,以便在可能的情况下在单个中间阵列上运行?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
考虑下面的片段,它将一个对象数组转换为数字数组,过滤掉负值,然后加倍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? (不包括初始对象数组).

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

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

解决方法

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

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

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

猜你在找的JavaScript相关文章