【问题标题】:Best way to deallocate an array of array in javascript在javascript中释放数组数组的最佳方法
【发布时间】:2011-03-01 06:53:08
【问题描述】:

在 javascript 中释放数组数组以确保不会发生内存泄漏的最佳方法是什么?

var foo = new Array();
foo[0] = new Array();
foo[0][0] = 'bar0';
foo[0][1] = 'bar1';
foo[1] = new Array();
...
  1. 删除(foo)?
  2. 遍历 foo、delete(foo[index]) 和 delete(foo)?
  3. 1 和 2 给我同样的结果?
  4. 没有?

【问题讨论】:

    标签: javascript


    【解决方案1】:
    foo = null;
    

    应该足以让垃圾收集器摆脱数组,包括它的所有子数组(假设没有其他东西引用它们)。请注意,它只会在需要时删除它,而不是立即删除,因此如果浏览器的内存消耗没有立即下降,请不要感到惊讶:这不是泄漏。

    如果这些数组元素中的任何一个包含对 DOM 节点的引用,它可能会变得更加复杂。

    【讨论】:

    • 在 IE6 中只会变得更复杂。
    • 对于那些在 2014 年访问这里的人,请注意,几乎没有理由将某些内容设置为 null 或尝试“释放”它(JS 中不存在的概念),或做任何其他事情让GC做任何事情。它本身就很好,非常感谢。
    【解决方案2】:

    你不能删除变量,把它设为null foo = null;

    .. 或使用命名空间对象

    var namespace = {};
    namespace.foo = [];
    delete namespace.foo;
    

    【讨论】:

      【解决方案3】:

      我认为 Array.splice 也可以为您解决问题。它是在每个索引上使用 delete 的替代方法。

      参考:https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Array/Splice

      你也可以像这样将它与 Array.forEach 结合起来:

      foo.forEach(function(element,ind,arr){
       arr.splice(ind,1);  //emptying the array
      });
      foo = null; //remove ref to empty array
      

      如果您只使用 forEach 部分,您将清空 foo 数组。我认为在内部 splice 方法会删除一个引用,因此您可以通过这种方式很好地删除元素。最后一行然后删除对剩下的空数组的引用。

      对此不太确定,但值得研究。

      【讨论】:

      • 清除每个数组是没有意义的,除非它们在别处被引用。
      • foo.length = 0; 可以完全一样。
      • 这样做是 O(n^2) :( 从数组前面拼接是 O(n) 因为每个元素都被重新索引。你建议的解决方案这样做 n 次,给 O (n^2) 复杂度。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 2011-04-17
      • 2023-01-19
      相关资源
      最近更新 更多