在数组元素上使用delete将其从数组中删除是我意识到从数组中删除元素以便.forEach()调用跳过索引的唯一方法.
问题
>在索引上使用delete,例如,exampleArray [i],
导致后续的exampleArray.push()增加内存
消耗数组对象?
>删除对象如何影响垃圾收集器?
>是否有一种更有效的方法来摆脱一个例子
元件?
前者的例子
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");
感谢任何帮助,谢谢.
解决方法
Does using the delete on an index,
exampleArray[i]
for example,cause a subsequentexampleArray.push()
to increase the memory consumption of the array object?
无论是否先删除,push都会增加内存消耗.通常.如果引擎已为其他项目预先分配了存储空间,则可能不会.如果你想象引擎可能以某种方式重新使用删除打开的空间,以避免在下次推送时分配额外的内存,很可能不会.
How does deleting an element effect the garbage collector?
如果删除的元素不在其他范围内,则该元素受GC影响.
Is there a more efficient way of ridding an
exampleArray
of an element?
您必须决定是否介意使用稀疏数组.如果你不这样做,并且正如你指出的那样等等,则跳过这些洞,然后删除是最快的.如果要使用splice压缩已删除元素周围的数组,则成本可能会高出2倍.
引擎实现了在内部表示数组的不同策略,有时在它们之间切换 – 例如,当数组达到特定程度的稀疏性时.每个引擎都有不同的策略.回答这些性能问题的唯一可靠方法是运行性能测试或读取引擎源.
他们关于GC的关键点是你不必担心它.你不想进入猜测引擎.您可以优化一个引擎,并发现另一个引擎的性能变差.
所有这些微优化问题仅在您拥有涉及大量数据对象的逻辑时才有意义,您需要在其上执行数百万个运算符.如果是这种情况,可能是您想要滚动自己的数据结构.