395 votes

Suppression d’objets en JavaScript

Je suis un peu confus avec du JavaScript delete de l'opérateur. Prendre le morceau de code suivant:

var obj = {
    helloText: "Hello World!"
};

var foo = obj;

delete obj;

Après ce morceau de code a été exécuté, obj est null, mais foo fait toujours référence à un objet exactement comme obj. Je devine que cet objet est le même objet que l' foo pointé.

Cela me confond, parce que je m'attendais à ce que l'écriture delete obj a supprimé l'objet qu' obj a été pointant vers dans la mémoire-et pas seulement la variable obj.

Est-ce à cause du JavaScript Garbage Collector est de travailler sur un conserver/version de base, de sorte que si je n'avais pas d'autres variables pointant vers l'objet, il allait être supprimé de la mémoire?

(En passant, mon test a été effectué dans Safari 4.)

483voto

Jesse Rusak Points 33702

L'opérateur delete supprime une seule référence, jamais un objet lui-même. Si il l'a fait supprimer l'objet lui-même, les autres les autres références serait bancale, comme un C++ supprimer. Pour y accéder, l'un d'eux serait de provoquer un crash. Pour les faire tous le tour null signifie avoir du travail supplémentaire lors de la suppression ou de la mémoire supplémentaire pour chaque objet).

Javascript est le garbage collector, vous n'avez pas besoin de supprimer les objets eux-mêmes - ils être enlevé lorsqu'il n'existe aucun moyen de se référer à eux plus.

Il peut être utile de supprimer les références à un objet si vous avez terminé avec eux, parce que cela donne le garbage collector plus d'informations sur ce qui est en mesure de le récupérer. Si les références restent à un objet de grande taille, cela peut l'amener à être non récupérés - même si le reste de votre programme n'a pas fait usage de cet objet.

169voto

Guffa Points 308133

L' delete commande n'a aucun effet sur l'organisation régulière de variables, seules les propriétés. Après l' delete commande de la propriété n'a pas la valeur null, il n'existe pas du tout.

Si la propriété est un objet de référence, l' delete commande supprime la propriété, mais pas de l'objet. Le ramasse-miettes de prendre soin de l'objet, si elle n'a pas d'autres références.

Exemple:

var x = new Object();
x.y = 42;

alert(x.y); // shows '42'

delete x; // no effect
alert(x.y); // still shows '42'

delete x.y; // deletes the property
alert(x.y); // shows 'undefined'

(Testé dans Firefox.)

58voto

Alex Points 261

"les variables déclarées implicitement" sont des propriétés de l'objet global, donc supprimer fonctionne comme il fonctionne sur n'importe quelle propriété. Les Variables déclarées avec var sont indestructibles.

24voto

David Ackerman Points 3667

Venant de Mozilla Documentation", Vous pouvez utiliser l'opérateur d'effacement pour supprimer les variables déclarées implicitement, mais pas celles qui sont déclarées avec l'instruction var. "

Voici le lien: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Operators:Special_Operators:delete_Operator

4voto

Bohr Points 999

@Guffa 's réponse. J'ai trouvé la méthode suivante fonctionne pour moi:

var obj = {
    helloText: "Hello World!"
};

obj = null;

delete obj;

Par le réglage de l'obj d' null tout d'abord, vous avez supprimé toutes les références à elle, alors vous pouvez le supprimer complètement.

Je n'ai pas testé sur d'autres navigateurs, mais cela fonctionne dans phonegap 1.7.0

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