【问题标题】:Clearing objects from Javascript array [duplicate]从Javascript数组中清除对象[重复]
【发布时间】:2012-09-28 13:04:11
【问题描述】:

可能重复:
how to empty an array in JavaScript
Best way to deallocate an array of array in javascript

我有一个对象数组:

var arr = [complexObj1, complexObj2];

如果我想清空数组并确保没有内存泄漏,下面会做吗?

arr.length = 0;

或者我是否需要遍历我的数组并调用类似:

complexObj.release(); or
arr[0] = null; or 
delete arr[0];

?

【问题讨论】:

  • 是的,我实际上已经阅读了how to empty an array in Javascript 的问题,这就是为什么我写 arr.length = 0 作为可能的解决方案。我在问如果对象不是字符串和整数之类的简单对象,它是否真的会触发 JS 垃圾回收

标签: javascript arrays memory memory-management


【解决方案1】:

如果数组由简单的对象组成,没有引用其他方法或 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 以从节点中删除事件侦听器。

这是我认为人们通常会错过的一个简单示例。它也不必是事件处理程序,但可以是在复杂对象之外引用的任何内容。

【讨论】:

    【解决方案2】:

    只需重新初始化数组:

    arr = [];
    

    【讨论】:

    【解决方案3】:

    你只需要这样做

    arr = null
    

    【讨论】:

      【解决方案4】:

      有点像

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-17
        • 2018-06-19
        • 2014-06-25
        • 2020-10-25
        • 2018-01-08
        • 2018-11-14
        • 2020-04-15
        相关资源
        最近更新 更多