2010-06-08 80 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

相關問題