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.)
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.
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.)
"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.
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
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
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.
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.
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.
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);
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.
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.
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];