5 votes

Effacer les objets du tableau Javascript

Duplicata possible :
comment vider un tableau en JavaScript
Meilleur moyen de désallouer un tableau de tableaux en javascript

J'ai un tableau d'objets :

var arr = [complexObj1, complexObj2];

Si je veux effacer le tableau et m'assurer qu'il n'y a pas de fuite de mémoire, la procédure suivante le fera-t-elle ?

arr.length = 0;

Ou dois-je itérer dans mon tableau et appeler quelque chose comme :

complexObj.release(); or
arr[0] = null; or 
delete arr[0];

?

2voto

batzkoo Points 590

Si le tableau est constitué d'objets simples sans références à d'autres méthodes ou éléments du DOM, toutes les solutions ci-dessus suffisent.

Si, toutefois, le tableau contient des objets qui, à leur tour, contiennent des références à des gestionnaires d'événements que vous avez attachés à des éléments du DOM, l'objet ne sera pas détruit lorsque vous effacerez le tableau.

var Complex = function(nodeId){
   this.node=document.getElementById(nodeId);
   this.handler=function(e){alert('wohooo'};

   this.node.addEventListener('click', this.handler);
}

var myArray = [new Complex('buttonOne'), new Complex('buttonTwo')];

Si vous réinitialisez maintenant le tableau en utilisant myArray = [] . Le tableau sera nettoyé mais les objets contiennent toujours un nœud et un gestionnaire d'événement en direct qui se déclenchera lorsque les boutons seront cliqués, ce qui signifie que l'objet ne peut pas être supprimé de la mémoire. Vous avez juste perdu la référence à cet objet en le retirant du tableau.

Votre première idée était correcte : vous deviez en quelque sorte "détruire" l'objet complexe et supprimer toutes les références qu'il contient.

Complex.prototype.release = function() {
    this.node.removeEventListener('click',this.handler);
    delete this.handler;
    delete this.node

}

Vous bouclez maintenant dans le tableau et appelez release sur les objets pour supprimer les écouteurs d'événements du nœud.

C'est un exemple simple de ce que je pense que les gens ratent généralement. Il ne s'agit pas forcément de gestionnaires d'événements, mais de tout ce qui est référencé en dehors de l'objet complexe.

1voto

Codesen Points 1069

Il suffit de réinitialiser le tableau :

arr = [];

0voto

Anshu Points 7149

Vous devez faire juste

arr = null

0voto

shox Points 617

Quelque chose comme

var t = myArray;
delete myArray;
//or
myArray = null;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X