Je suis un peu confus avec l' delete
opérateur de JavaScript . Prenez le morceau de code suivant:
var obj = {
helloText: "Hello World!"
};
var foo = obj;
delete obj;
Une fois que ce morceau de code a été exécuté, obj
is null
, mais foo
fait toujours référence à un objet exactement comme obj
. Je suppose que cet objet est le même objet que celui foo
indiqué.
Cela m'embrouille, car je m'attendais à ce que l'écriture delete obj
supprime l'objet qui obj
pointait en mémoire - pas seulement la variable obj
.
Est-ce parce que le garbage collector 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 supprimé de la mémoire?
(Au fait, mes tests ont été effectués dans Safari 4.)
javascript
pointers
object
memory-management
garbage-collection
Steve Harrison
la source
la source
var obj = { helloText: "Hello World!" }; var foo = obj; delete obj;
objet n'est pas supprimé vérifierobj
supprimer l'utilisation:delete obj.helloText
puis vérifierfoo now foo is an empty object
delete
n'est pas pour supprimer des objets en javascript.delete
Est utilisé pour supprimer une clé d'objet. Dans votre casvar obj = { helloText: "Hello World!" }; var foo = obj; delete obj;
, l'objet n'est pas supprimé. Vérifiezobj
. Ensuite, exécutezdelete obj.helloText
et vous pouvez voir quefoo
maintenant pointe vers un vide objet. "" "Réponses:
L'opérateur de suppression supprime uniquement une référence, jamais un objet lui-même. S'il supprimait l'objet lui-même, les autres références restantes seraient suspendues, comme une suppression C ++. (Et accéder à l'un d'eux provoquerait un plantage. Pour les rendre tous nuls, cela signifierait avoir du travail supplémentaire lors de la suppression ou de la mémoire supplémentaire pour chaque objet.)
Étant donné que Javascript est récupéré, vous n'avez pas besoin de supprimer les objets eux-mêmes - ils seront supprimés lorsqu'il n'y aura plus aucun moyen de s'y référer.
Il peut être utile de supprimer les références à un objet si vous en avez terminé avec elles, car cela donne au garbage collector plus d'informations sur ce qui peut être récupéré. Si des références restent à un objet volumineux, cela peut entraîner sa non-récupération - même si le reste de votre programme n'utilise pas réellement cet objet.
la source
delete
mot-clé ne fonctionne que pour les propriétés d'un objet, pas pour les variables. perfectionkills.com/understanding-deletevar obj = {a: {}}; delete obj.a;
window
?var
)La
delete
commande n'a aucun effet sur les variables régulières, seulement sur les propriétés. Après ladelete
commande, la propriété n'a pas de valeurnull
, elle n'existe plus du tout.Si la propriété est une référence d'objet, la
delete
commande supprime la propriété mais pas l'objet. Le garbage collector prendra soin de l'objet s'il n'y a pas d'autre référence.Exemple:
(Testé dans Firefox.)
la source
x
variable devient juste une propriété sur l'window
objet global etdelete x;
supprime vraiment lax
variable.x
ce ne sera pas une variable appropriée dans certains navigateurs, mais une propriété dans l'window
objet. C'est bien sûr un problème avec la console, et ne reflète pas la façon dont le code est normalement exécuté."les variables déclarées implicitement" sont des propriétés de l'objet global, donc supprimez-les fonctionne comme elles fonctionnent sur n'importe quelle propriété. Les variables déclarées avec var sont indestructibles.
la source
let
.Issu 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
la source
delete
n'est pas utilisé pour supprimer un objet dans le script Java.delete
utilisé pour retirer unobject key
dans votre casl'objet n'est pas supprimé vérifier obj prendre toujours les mêmes valeurs supprimer l'utilisation:
puis vérifiez
obj, foo
, les deux sont des objets vides.la source
Je viens de trouver un jsperf que vous pourriez considérer intéressant à la lumière de cette affaire. (il pourrait être utile de le garder pour compléter l'image)
Il compare la suppression , la définition de null et la définition d' undefined .
Mais gardez à l'esprit qu'il teste le cas lorsque vous supprimez / définissez la propriété plusieurs fois.
la source
Mis à part les questions du GC, pour les performances, il faut considérer les 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 que de la supprimer, car cela pourrait modifier les utilisations de Chrome de la `` classe '' en coulisses.
la source
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.) lève TypeError "l'objet ne prend pas en charge cette action".
Plus tard, si vous devez vérifier où la propriété a une signification pleine valeur,
el.foo !== undefined
car"foo" in el
elle retournera toujours true dans IE.Si vous avez vraiment besoin que la propriété disparaisse vraiment ...
si vous avez besoin d'utiliser l'objet hôte avec l'api hôte ...
la source
Je suis tombé sur cet article dans ma recherche de cette même réponse. Ce que j'ai fini par faire, c'est simplement d'extraire
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 non. Cette technique m'a été utile pour tester mon code dans les outils Chrome Dev ou la console Web FireFox.la source
Ce travail pour moi, bien que ce ne soit pas une bonne pratique. Il supprime simplement tous les éléments associés auxquels l'objet appartient.
la source
Définir une variable pour
null
vous assurer de rompre toutes les références aux objets dans tous les navigateurs, y compris les références circulaires établies entre les éléments DOM et les étendues Javascript. En utilisant ladelete
commande, nous marquons les objets à effacer lors de la prochaine exécution de la récupération de place, mais s'il existe plusieurs variables référençant le même objet, la suppression d'une seule variable NE libérera PAS l'objet, cela supprimera simplement le lien entre cette variable et L'object. Et lors de la prochaine exécution de la récupération de place, seule la variable sera nettoyée.la source