从Javascript数组中清除对象

3

可能是重复问题:
如何在JavaScript中清空数组
在JavaScript中释放数组的最佳方法

我有一个对象数组:

var arr = [complexObj1, complexObj2];

如果我想清空数组并确保没有内存泄漏,以下代码是否可行?
arr.length = 0;

或者我需要遍历数组并调用类似以下内容的东西吗:
complexObj.release(); or
arr[0] = null; or 
delete arr[0];

?


是的,我确实已经阅读了有关如何在Javascript中清空数组的问题(https://dev59.com/k3M_5IYBdhLWcg3wyWSt),这就是为什么我写了arr.length = 0作为可能的解决方案。我想知道如果对象不是简单对象(如字符串和整数),它是否会触发JS垃圾回收。 - Charlotte Tan
4个回答

2

如果数组由简单对象组成,没有引用其他方法或DOM元素,那么上述所有解决方案都足够。

然而,如果数组包含对象,这些对象反过来持有对您已附加到DOM元素的事件处理程序的引用,则在清除数组时对象将不会被销毁。

var Complex = function(nodeId){
   this.node=document.getElementById(nodeId);
   this.handler=function(e){alert('wohooo'};

   this.node.addEventListener('click', this.handler);
}

var myArray = [new Complex('buttonOne'), new Complex('buttonTwo')];

如果您现在使用myArray = []“重置”数组。数组将被清除,但对象仍然保留节点和活动事件处理程序,当单击按钮时会触发该处理程序,这意味着该对象无法从内存中删除。通过从数组中删除,您只是失去了对它的引用。
您的第一个想法是正确的,即您应该以某种方式“销毁”复杂对象并删除它所持有的任何引用。
Complex.prototype.release = function() {
    this.node.removeEventListener('click',this.handler);
    delete this.handler;
    delete this.node

}

你现在需要遍历数组并在对象上调用release,以从节点中删除事件监听器。
这是一个我认为人们通常会忽略的简单示例。它不仅仅适用于事件处理程序,还可以是复杂对象之外引用的任何内容。

1

只需重新初始化数组:

arr = [];

根据https://dev59.com/k3M_5IYBdhLWcg3wyWSt,这是不好的做法并且不起作用... - Charlotte Tan
这将初始化数组。 - Codesen

0

你只需要做

arr = null

0

类似于

var t = myArray;
delete myArray;
//or
myArray = null;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接