Suppression D'objets en JavaScript

je suis un peu confus avec L'opérateur delete de JavaScript. Prenez le code suivant:

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

var foo = obj;

delete obj;

après que ce morceau de code a été exécuté, obj est null , mais foo se réfère toujours à un objet exactement comme obj . Je suppose que cet objet est le même objet que foo pointait.

cela me confond, parce que je m'attendais à ce que l'écriture delete obj a supprimé l'objet que obj pointait en mémoire-pas seulement la variable obj .

est-ce parce que le collecteur D'ordures de JavaScript fonctionne sur une base de conservation/libération, de sorte que si je n'avais pas d'autres variables pointant vers l'objet, il serait retiré de la mémoire?

(soit dit en passant, mes tests ont été faits en Safari 4.)

336
demandé sur Sam 2009-04-13 03:18:31

12 réponses

l'opérateur delete ne supprime qu'une référence, jamais un objet lui-même. S'il supprimait l'objet lui-même, d'autres références seraient pendantes, comme un c++ delete. (Et accéder à l'un d'eux causerait un accident. Les rendre tous nuls signifierait avoir du travail supplémentaire lors de la suppression ou de la mémoire supplémentaire pour chaque objet.)

comme Javascript est un ramassage de déchets, vous n'avez pas besoin de supprimer les objets eux - mêmes-ils seront supprimés quand il n'y a aucun moyen de reportez-vous à plus.

il peut être utile de supprimer les références à un objet si vous en avez fini avec elles, car cela donne au ramasseur d'ordures plus d'informations sur ce qui peut être récupéré. Si les références restent à un objet de grande taille, cela peut provoquer qu'il ne soit pas récupéré - même si le reste de votre programme n'utilise pas réellement cet objet.

422
répondu Jesse Rusak 2009-04-13 01:34:45

la commande delete n'a aucun effet sur les variables régulières, seulement les propriétés. Après la commande delete la propriété n'a pas la valeur null , elle n'existe pas du tout.

si la propriété est une référence d'objet, la commande delete supprime la propriété mais pas l'objet. Le éboueur s'occupe de l'objet s'il 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.)

152
répondu Guffa 2009-04-12 23:39:51

"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.

52
répondu Alex 2011-07-13 20:54:59

provenant de la Documentation Mozilla, "vous pouvez utiliser l'opérateur delete pour supprimer les variables déclarées implicitement mais pas celles déclarées avec la déclaration var. "

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

23
répondu David Ackerman 2009-04-12 23:42:55

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

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

obj = null;

delete obj;

en positionnant l'obj à null d'abord, vous avez supprimé toute référence à celui-ci, puis vous pouvez le supprimer complètement.

Je ne l'ai pas testé sur un autre navigateur, mais cela fonctionne dans phonegap 1.7.0

7
répondu Bohr 2012-06-21 06:56:07

delete n'est pas utilisé pour supprimer un objet en Script java.

delete utilisé pour enlever un object key dans votre cas

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

objet non supprimé cocher obj toujours prendre les mêmes valeurs supprimer usage:

delete obj.helloText

, puis cochez obj, foo , les deux sont des objets vides.

4
répondu Umair Ahmed 2018-02-20 09:40:12

je Viens de trouver un jsperf vous pouvez envisager d'intéressant à la lumière de cette question. (il pourrait être utile de le garder pour compléter le tableau)

il compare supprimer , le réglage null et le réglage Non défini .

mais gardez à l'esprit qu'il teste le cas lorsque vous supprimez/définissez propriété plusieurs fois.

2
répondu garek 2015-02-12 17:17:00

outre les questions du GC, pour le rendement, il faut tenir compte des optimisations que le navigateur peut faire en arrière-plan - >

http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript /

il semble qu'il soit préférable d'annuler la référence plutôt que de la supprimer, car cela pourrait changer les utilisations de la "classe" de Chrome dans les coulisses.

2
répondu sksizer 2016-04-18 12:25:03

IE 5 à 8 a un bug où l'utilisation de delete on properties of a host object (Window, Global, DOM etc) lance TypeError "object does not support this action".

var el=document.getElementById("anElementId");
el.foo = {bar:"baz"};
try{
    delete el.foo;
}catch(){
    //alert("Curses, drats and double double damn!");
    el.foo=undefined; // a work around
}

plus tard si vous avez besoin de vérifier où la propriété a une signification pleine valeur utiliser el.foo !== undefined parce que "foo" in el retourne toujours vrai dans IE.

Si vous avez vraiment besoin de la propriété vraiment disparaître...

function hostProxy(host){
    if(host===null || host===undefined) return host;
    if(!"_hostProxy" in host){
       host._hostproxy={_host:host,prototype:host};
    }
    return host._hostproxy;
}
var el=hostProxy(document.getElementById("anElementId"));
el.foo = {bar:"baz"};

delete el.foo; // removing property if a non-host object

si vous avez besoin de utilisez l'objet host avec l'api host...

el.parent.removeChild(el._host);
1
répondu johndhutcheson 2011-11-17 22:18:41

je suis tombé sur cet article dans ma recherche pour cette même réponse. Ce que j'ai fini par faire est de sortir obj.pop() toutes les valeurs stockées/objets dans mon objet afin que je puisse réutiliser l'objet. Vous ne savez pas si c'est une mauvaise pratique ou pas. Cette technique m'a été utile pour tester mon code dans les outils de développement de Chrome ou la console Web de FireFox.

0
répondu Craig London 2013-08-04 07:30:13

paramétrer une variable à null permet de briser toute référence aux objets dans tous les navigateurs, y compris les références circulaires faites entre les éléments DOM et les portées Javascript. En utilisant la commande delete , nous marquons des objets à être effacés lors de la prochaine sortie de la collecte des ordures, mais s'il y a plusieurs variables se référant au même objet, supprimer une seule variable ne libérera pas l'objet, cela supprimera simplement le lien entre cette variable et le objet. Et au prochain passage de la collecte des ordures, seule la variable sera nettoyée.

0
répondu Pedro Justo 2014-09-18 10:36:23

ce travail pour moi, bien que ce ne soit pas une bonne pratique. C'simplement supprimer tous les l'élément associé auquel appartient l'objet.

 for (element in homeService) {
          delete homeService[element];
0
répondu vineet sagar 2016-06-26 17:36:11