Suppression d'objets en JavaScript

Je suis un peu confondu avec l'opérateur de delete de JavaScript. Prenez le code suivant:

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

Après que ce 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 souligné.

Cela me confond, parce que je m'attendais à ce que l' delete obj écriture delete obj l'objet que obj pointait dans la mémoire, et pas seulement la variable obj .

Est-ce parce que le Garbage Collector de JavaScript fonctionne sur une base de retenue / publication, de sorte que si je n'avais pas d'autres variables pointant vers l'objet, il serait retiré de la mémoire?

(En passant, mes tests ont été effectués dans Safari 4.)

L'opérateur de suppression supprime uniquement une référence, jamais un objet lui-même. Si elle a supprimé l'objet lui-même, d'autres références restantes seraient pendantes, comme une suppression C ++. (Et l'accès à l'un d'entre eux entraînerait un accident. Pour que tous les résultats soient nulles, cela signifie avoir du travail supplémentaire lors de la suppression ou de la mémoire supplémentaire pour chaque objet).

Étant donné que Javascript est collecté, vous n'avez pas besoin de supprimer les objets eux-mêmes – ils seront supprimés s'il n'y a plus aucun moyen de se référer à eux.

Il peut être utile de supprimer des références à un objet si vous en avez fini, car cela donne au collecteur d'objets plus d'informations sur ce qui peut être récupéré. Si les références restent dans un objet volumineux, cela peut provoquer sa non-reconnaissance – même si le reste de votre programme n'utilise pas cet objet.

La commande delete n'a aucun effet sur les variables régulières, seules les propriétés. Après la commande de 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 collecteur d'ordures s'occupera de l'objet s'il n'a pas d'autres références.

Exemple:

 var x = new Object(); xy = 42; alert(xy); // shows '42' delete x; // no effect alert(xy); // still shows '42' delete xy; // deletes the property alert(xy); // shows 'undefined' 

(Testé sur Firefox.)

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

En provenance de la documentation de Mozilla, «Vous pouvez utiliser l'opérateur de suppression pour supprimer les variables déclarées implicitement mais pas celles 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

Sur la base de la réponse de @Guffa. J'ai trouvé que la méthode suivante fonctionne pour moi:

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

En réglant d'abord l'obj à null , vous avez supprimé toute la référence, 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ée pour supprimer un objet dans java Script.

delete utilisé pour supprimer une object key dans votre cas

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

L'objet n'est pas effacé vérifier obj encore prendre les mêmes valeurs supprimer l'utilisation:

delete obj.helloText

Et ensuite vérifiez obj, foo , les deux sont des objets vides.

Je viens de trouver un jsperf que vous pourriez considérer comme intéressant à la lumière de cette question. (Il pourrait être utile de garder le cap pour compléter l'image)

Il compare la suppression , le réglage nul et le réglage indéfini .

Mais gardez à l'esprit qu'il teste le cas lorsque vous supprimez / définissez des propriétés à plusieurs reprises.

Outre les questions de GC, pour la performance, 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 vaut mieux nuler la référence que de la supprimer, car cela peut changer la classe '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '

IE 5 à 8 a un bug où l'utilisation de la suppression sur les propriétés d'un objet hôte (Window, Global, DOM, etc.) Throws TypeError "l'objet ne supporte pas cette 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 devez vérifier où la propriété a une valeur pleine de sens, utilisez el.foo !== undefined car "foo" in el sera toujours vrai dans IE.

Si vous avez vraiment besoin de la propriété pour 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 devez utiliser l'objet hôte avec l'hôte api …

 el.parent.removeChild(el._host); 

J'ai trouvé cet article dans ma recherche de cette même réponse. Ce que j'ai fini de faire est de faire apparaître obj.pop() toutes les valeurs / objets stockés dans mon objet afin que je puisse réutiliser l'objet. Je ne sais pas si c'est une mauvaise pratique ou pas. Cette technique m'a été utile pour tester mon code dans les outils Chrome Dev ou FireFox Web Console.

Définir une variable à null assure de briser toute référence à des objets dans tous les navigateurs, y compris des références circulaires effectuées entre les éléments DOM et les étendues Javascript. En utilisant la commande delete nous marquons les objets à delete lors de la prochaine exécution de la collecte des déchets, mais s'il existe plusieurs variables référençant le même objet, la suppression d'une seule variable NE JAMAIS libérer l'objet, il supprimera simplement le lien entre cette variable Et l'objet. Et sur la prochaine série de la collecte des ordures, seule la variable sera nettoyée.

Cela fonctionne pour moi, bien qu'il ne soit pas une bonne pratique. Il suffit de supprimer tout l'élément associé auquel appartient l'objet.

  for (element in homeService) { delete homeService[element];