Javascript 对数组使用delete和.push()是否会影响性能/内存消耗?

Javascript 对数组使用delete和.push()是否会影响性能/内存消耗?,javascript,arrays,micro-optimization,Javascript,Arrays,Micro Optimization,问题 在数组元素上使用delete将其从数组中删除是我所知道的唯一从数组中删除元素的方法,这样.forEach()调用就会跳过索引 问题 是否在索引上使用delete,例如exampleArray[i], 导致后续的exampleArray.push()增加内存 数组对象的消耗 删除对象如何影响垃圾收集器 有没有更有效的方法来消除exampleArray中的 元素 前者的示例 var exampleArray = []; var n = 500; //Does this line impl

问题

在数组元素上使用
delete
将其从数组中删除是我所知道的唯一从数组中删除元素的方法,这样
.forEach()
调用就会跳过索引

问题

  • 是否在索引上使用
    delete
    ,例如
    exampleArray[i]
    , 导致后续的
    exampleArray.push()
    增加内存 数组对象的消耗
  • 删除对象如何影响垃圾收集器

  • 有没有更有效的方法来消除
    exampleArray
    中的 元素

前者的示例

var exampleArray = [];
var n = 500;

//Does this line imply a memory allocation?
exampleArray.length = n;

exampleArray.fill("Lorem Ipsum", 0);

exampleArray.forEach(function(cur, ind, arr) {
  if(ind % 4 === 0) {
    delete arr[ind]; //Actually deletes the object itself, index no longer exists
    //Length does not change, however. Does available memory?
  }
}, this);

n /= 4;

//Where, in memory, are these placed?
while(n--) exampleArray.push("amet dolor");

非常感谢您的帮助。

delete
在javascript中有一个非常具体的功能:。您不应尝试使用它从数组中删除项

相反,请使用:

例如:

var arr = [1,2,3,4];
arr.splice(1, 1);

console.log(arr); // [ 1, 3, 4 ]
在回答关于垃圾收集的问题时,GC不受
delete
调用的影响,除非它们碰巧删除了对某个对象的唯一引用<代码>删除不会强制GC或促进GC

例如,对索引
exampleArray[i]
使用delete是否会导致后续的
exampleArray.push()
增加数组对象的内存消耗

push
会增加内存消耗,无论之前是否有
delete
。通常如果引擎为其他项目预先分配了存储空间,则可能不会。如果您设想引擎可能会以某种方式重新使用由
删除打开的空间,以避免在下一次
推送
时分配额外内存,则很可能不会

删除元素如何影响垃圾收集器

如果删除的元素没有保留在作用域中,则它受GC约束

有没有更有效的方法去除
exampleArray
元素

您必须决定是否介意以稀疏数组结束。如果您不这样做,并且正如您指出的那样,
forEach
等跳过漏洞,那么
delete
是最快的。例如,如果要使用
splice
压缩已删除元素周围的数组,成本可能会高出2倍

引擎在内部实现表示数组的不同策略,有时在它们之间切换——例如,当数组达到特定的稀疏度时。每个引擎都有不同的策略。回答此类性能问题的唯一可靠方法是运行性能测试,或阅读引擎源代码

关于GC的关键点是您不必担心它。你不想对引擎进行事后评估。您可以针对一个引擎进行优化,发现另一个引擎的性能变得更差


所有这些微观优化问题只有在逻辑涉及到巨大的数据对象时才有意义,在这些数据对象上要执行数以百万计的操作。如果是这样的话,那么您可能希望使用自己的数据结构。

您的假设都大错特错
delete
并不是从数组中删除索引的唯一方法,事实上,它根本不这样做,甚至不适用于数组?它如何影响垃圾收集器,以及其他任何东西,在那之后真的变得无关紧要了吗?我没有做任何假设,尽管听起来像是你做的。“我说过这是我意识到的唯一方式,能启发我吗?”安德鲁安德森如果你想为你的问题寻找简短而甜蜜的答案,那么答案是1)不2)不是3)[]。我感谢你的自信,我在寻找测试。谢谢如果MDN上的页面提供了@adeneo?tests的答案,你认为我会把它贴在这里吗?文档非常方便地涵盖了所有三个答案。请参阅下面我的答案中的链接。感谢您阅读问题,并注意到.forEach()的上下文,它专门处理稀疏数组。我希望我可以编辑我的帖子来指定我喜欢谁的时间。我不是向下投票人,但我会注意到数组元素是对象的属性。当然也有使用delete的用例,只要您不介意以稀疏数组结尾。@torazaburo我认为在本文中,索引是属性,而不是索引中的实际元素