2010-06-08 5 views
5

Quelle est la meilleure façon de libérer un tableau de tableau en javascript pour s'assurer qu'il n'y aura pas de fuite de mémoire?Meilleure façon de libérer un tableau de tableau en javascript

var foo = new Array(); 
foo[0] = new Array(); 
foo[0][0] = 'bar0'; 
foo[0][1] = 'bar1'; 
foo[1] = new Array(); 
... 
  1. suppression (foo)?
  2. itérer à travers foo, supprimer (foo [index]) et supprimer (foo)?
  3. 1 et 2 me donnent le même résultat?
  4. aucun?

Répondre

1

vous ne pouvez pas supprimer la variable, réglez null foo = null;

.. ou utiliser un objet espace de noms

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

Je pense que Array.splice pourrait également faire l'affaire pour vous. C'est une alternative à l'utilisation de supprimer sur chaque index.

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

Vous pouvez également combiner avec Array.forEach comme ceci:

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

Si vous utilisez juste la partie forEach, vous vider le tableau foo. Je pense que la méthode d'épissure supprime une référence en interne, ce qui vous permet de supprimer les éléments de cette façon. La dernière ligne supprime alors la référence du tableau vide qui reste.

Pas très sûr à ce sujet, mais cela vaut la peine de faire des recherches.

+1

Il ne sert à rien d'effacer chaque tableau, sauf s'ils sont référencés ailleurs. – SLaks

+1

'foo.length = 0;' peut faire exactement la même chose. – CMS

+0

O (n^2) :( L'épissage de l'avant du tableau est O (n) puisque chaque élément est réindexé La solution que vous suggérez fait ceci n fois, donnant la complexité O (n^2) –

7
foo = null; 

devrait être suffisant pour le collecteur d'ordures pour se débarrasser du tableau, y compris tous ses tableaux d'enfants (en supposant rien n'a d'autre référence à eux). Notez qu'il ne s'en débarrassera que lorsqu'il le voudra, pas immédiatement, alors ne soyez pas surpris si la consommation de mémoire du navigateur ne baisse pas tout de suite: ce n'est pas une fuite.

Cela devient potentiellement plus compliqué si l'un de ces éléments du tableau contient des références aux nœuds DOM.

+1

Cela devient de plus en plus compliqué dans IE6 – SLaks

+2

Pour ceux qui visitent ici en 2014, s'il vous plaît noter qu'il n'y a presque jamais de raison de mettre quelque chose à zéro ou d'essayer de le "désallouer" (un concept qui n'existe pas dans JS), ou faire quoi que ce soit d'autre pour que le GC fasse quoi que ce soit, ça va très bien tout seul, merci beaucoup. –

Questions connexes