2010-06-08 82 views
5

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

var foo = new Array(); 
foo[0] = new Array(); 
foo[0][0] = 'bar0'; 
foo[0][1] = 'bar1'; 
foo[1] = new Array(); 
... 
  1. 删除(富)?
  2. 遍历foo,delete(foo [index])和delete(foo)?
  3. 1和2给了我相同的结果?
  4. 无?

回答

1

不能删除变量,将其设置为null foo = null;

..或者使用一个命名空间对象

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

我想方法Array.splice也可能会为你做的伎俩。它是在每个索引上使用删除的替代方法。

编号: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方法会在内部删除一个引用,这样你就可以很好地以这种方式删除元素。最后一行然后删除对剩下的空数组的引用。

不太确定,但值得一些研究。

+1

清除每个数组没有意义,除非它们在别处被引用。 – SLaks 2010-06-08 17:51:49

+1

'foo.length = 0;'可以完全相同。 – CMS 2010-06-08 18:12:15

+0

这样做是O(n^2):( 从数组的前面拼接是O(n),因为每个元素都被重新索引。您建议的解决方案执行n次,给出O(n^2)复杂度 – 2015-09-23 21:16:47

7
foo = null; 

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

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

+1

它只是在IE6中变得更加复杂了 – SLaks 2010-06-08 18:15:50

+2

对于那些在2014年访问的人来说,请注意几乎没有理由将某些东西设置为null或试图“释放”它(这在JS中不存在的概念),或者做任何事情让GC做任何事,它本身就很好,非常感谢。 – 2014-12-25 06:59:49

相关问题