考虑下面的片段,它将一个对象数组转换为数字数组,过滤掉负值,然后加倍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
);
Run Code Online (Sandbox Code Playgroud)
当像这样链接在一起时,总共创建了多少个实际的Array对象?1还是3?(不包括初始objects
数组).
特别是,我在谈论由中创建的中间Array对象filter
,然后map
是链中的第二个调用:考虑到这些数组对象本身没有显式引用,Javascript运行时是否足够智能以在可能的情况下优化,在这种情况下,使用相同的内存区域?
如果无法用明确的是或否回答这个问题,我怎样才能在各种浏览器中确定这一点?(据我所知,数组构造函数不能再被覆盖,所以这不是一个选项)
到目前为止,评论很好,这里有一个总结答案:引擎可能会针对链接方法调用之间的内存使用进行优化,但您永远不应该指望引擎为您进行优化。
当评估链式方法的示例时,引擎的内存堆会以相同的顺序逐步受到影响(有关事件循环的 MDN 文档)。但是,它的工作原理可能取决于引擎......对于某些人来说,Array.map()
可能会创建一个新数组并在下一条消息执行之前对旧数组进行垃圾收集,它可能会保留旧数组,直到再次需要空间为止,它可能会改变一个数组就位,无论如何。理解这一点的兔子洞非常深。
你能测试一下吗?有时!jQuery 或 javascript 来查找页面的内存使用情况,这个 Google 文档是很好的起点。或者您可以使用http://jsperf.com/之类的工具来查看速度,这至少可以让您了解某些东西可能占用的空间有多大。但您也可以利用这段时间在您自己的代码中进行简单的优化。也许是一个更好的电话。