考虑下面的片段,它将一个对象数组转换为数字数组,过滤掉负值,然后加倍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/这样的速度来看速度,这可能会让你至少知道空间昂贵的东西可能是多少.但您也可以利用这段时间在您自己的代码中进行直接优化.可能是一个更好的电话.