2010-06-08 4 views
5

Was ist der beste Weg, um eine Array-Array in Javascript freizugeben, um sicherzustellen, dass keine Speicherlecks passieren?Die beste Möglichkeit, um ein Array Array in Javascript zu entfernen

var foo = new Array(); 
foo[0] = new Array(); 
foo[0][0] = 'bar0'; 
foo[0][1] = 'bar1'; 
foo[1] = new Array(); 
... 
  1. löschen (foo)?
  2. iterieren durch foo, löschen (foo [index]) und löschen (foo)?
  3. 1 und 2 geben mir das gleiche Ergebnis?
  4. keine?

Antwort

1

Sie nicht Variable löschen können, setzen Sie es null foo = null;

.. oder ein Objekt-Namespace verwenden

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

Ich denke, Array.splice auch könnte den Trick für Sie tun. Es ist eine Alternative zur Verwendung von Löschen für jeden Index.

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

Sie können es auch mit Array.ForEach wie folgt kombiniert werden:

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

Wenn Sie nur den Teil forEach verwenden, können Sie die foo Array leer wird. Ich denke intern entfernt die Spleißmethode eine Referenz, so dass Sie auf diese Weise Elemente entfernen können. Die letzte Zeile entfernt dann den Verweis auf das leere Array, das übrig ist.

Nicht sehr sicher, aber etwas Forschung wert.

+1

Es hat keinen Sinn, jedes Array zu löschen, es sei denn, sie werden an anderer Stelle referenziert. – SLaks

+1

'foo.length = 0;' kann genau dasselbe tun. – CMS

+0

Dies ist O (n^2) :( Spleißen von der Vorderseite des Arrays ist O (n) da jedes Element neu indiziert wird. Die vorgeschlagene Lösung tut dies n mal, was O (n^2) Komplexität ergibt –

7
foo = null; 

sollte genug für die Garbage Collector des Arrays, um loszuwerden, einschließlich aller Kind-Arrays (vorausgesetzt, nichts anderes als Hinweis auf diesen hat). Beachten Sie, dass Sie es nur dann loswerden, wenn es gewünscht wird, nicht sofort, also seien Sie nicht überrascht, wenn der Speicherverbrauch des Browsers nicht sofort abfällt: Das ist kein Leck.

Es wird möglicherweise komplizierter, wenn eines dieser Array-Elemente Verweise auf DOM-Knoten enthält.

+1

Es wird nur komplizierter in IE6. – SLaks

+2

Für diejenigen, die hier im Jahr 2014 besuchen, beachten Sie bitte, dass es fast nie einen Grund, um null zu setzen oder zu versuchen, es "freizugeben" (ein Konzept, das nicht in JS existiert), oder tun Sie alles andere, um den GC dazu zu bringen, irgendwas zu tun.Es ist ganz in Ordnung, vielen Dank. –

Verwandte Themen