Quel est le but de l'opérateur de suppression en Javascript?

Le comportement de l'opérateur de suppression semble très compliqué et il existe de nombreux malentendus sur ce qu'il fait réellement . Pour moi, il semble que réaffecter quelque chose à undefined fera plus sûrement ce que vous attendez.

Je n'ai jamais vu le mot-clé de delete dans Javascript utilisé dans le code non-exemple et je me demande s'il est particulièrement utile pour tout. La delete t-elle un but qui ne peut être réalisé en cas de réaffectation à un undefined ? Est-ce utilisé dans toutes les bibliothèques célèbres (p. Ex. JQuery, dojo, backbone, etc.)?

La suppression a-t-elle un but qui ne peut être réalisé en cas de réaffectation à un indéfini?

Oui. Si vous souhaitez démasquer une propriété à partir d'un prototype ou une cause, hasOwnProperty , et for (...in...) pour ne pas enregistrer la propriété comme existante, puis delete est approprié.

 var set = {}; set._x = true; alert('_x' in set); // true set._x = undefined; alert('_x' in set); // true delete set._x; alert('_x' in set); // false 

EDIT: Comme l'explique TJ Crowder:

Le but de l'opérateur de delete est de supprimer complètement une propriété d'un objet, alors que la définition d'une propriété à undefined définit la propriété à undefined .

Cela importe à part entière, mais cela importe quand vous utilisez les héritages, car si O dérive de P

 var P = { prop: 42 }; var O = Object.create(P); // P is O's prototype. 

Lorsque vous récupérez O.prop , vous obtenez la valeur de prop de O si O a une propriété avec ce nom (même si sa valeur est indéfinie), mais si O n'a pas la propriété du tout, la valeur sera récupérée P.prop place de P.prop .

 alert(O.prop); // "42" since O doesn't have its own prop, but P does. O.prop = undefined; alert(O.prop); // "undefined" since O has its own prop. delete O.prop; alert(O.prop); // "42" since the delete "unmasked" P.prop. 

Comme le souligne Mike Samuel dans sa réponse, l'un des usages les plus courants de la suppression est lorsque vous traitez un objet en tant que «sac de propriété» qui associe les noms aux valeurs. Il y a logiquement une différence entre "ce nom est maintenant mappé à une valeur fausse" et "ce nom n'est pas mappé du tout". "Supprimer" atteint le dernier.

Tout cela est bien compris. Je pensais pouvoir ajouter une note historique intéressante concernant les moteurs JScript 1.0 à 5.0.

Dans les implémentations Microsoft originales de JScript, nous avons utilisé des objets IDispatch de style automatisé OLE pour implémenter des objets expazant. IDispatch fonctionne évidemment en associant un nom à un "ID d'envoi", qui est simplement un nombre entier. Pour invoquer dynamiquement, d'abord, vous demandez à l'objet d'envoi de vous donner l'identifiant de distribution associé à un nom, puis vous dites «invoquez maintenant la méthode associée à cette ID, compte tenu de ces arguments».

Tout va bien et bien. Mais l'une des exigences du contrat IDispatch est que le mappage du nom à l'ID de la dépêche soit stable pendant toute la durée de vie de l'objet . Donc, si quelqu'un dit "ajouter une propriété Foo à cet objet", alors nous pourrions décider que la propriété Foo est associée à l'identifiant d'envoi 0x1234 dans cet objet. À partir de ce moment, chaque fois que l'objet est demandé pour l'identifiant d'envoi de "Foo", il doit rendre 0x1234, même si Foo est supprimé et ensuite ajouté à nouveau. Cela permet à un appelant de conserver son propre cache rapide de paires de nom / de distribution plutôt que de toujours demander l'objet à chaque invocation.

Le résultat pratique est que «supprimer» ne diminue en rien le fardeau de la mémoire sur l'objet dans cette implémentation ! Lorsque vous supprimez une propriété (dans la mise en œuvre d'origine), nous devons ajouter un peu au marquage d'objet qui détermine l'identificateur comme supprimé, mais nous devons conserver toutes les informations sur le nom / l'appariement d'ID au cas où ce nom revient. L'ajout d'un grand nombre de propriétés à un objet, puis la suppression de tous ne réduit pas l'objet en mémoire.

Le moteur JScript est évidemment complètement réécrit depuis mon temps (à l'exception, je crois, de l'analyseur et du lexer), donc je ne sais pas si le moteur a toujours cette caprice inhabituelle. Il serait intéressant de découvrir.

Si tu fais

  delete Foo.Bar; 

Il supprime la propriété Bar de l'objet Foo entièrement

  Foo.Bar = undefined 

Il suffit de Foo.Bar propriété Bar à indéfinie et Foo.Bar existe encore

Vous pouvez vérifier la réponse du lien suivant. Puis-je configurer des variables à undefined ou passer indéfini comme argument? Ce qui explique la différence de manière très détaillée.

Résumé:

Vous pouvez certainement attribuer indéfiniment, mais cela ne supprimera pas la variable. Seul l'opérateur delete object.property supprime vraiment les choses.

La suppression est vraiment destinée aux propriétés plutôt qu'aux variables en tant que telles. Les navigateurs vous permettront de sortir avec une variable de suppression directe, mais ce n'est pas une bonne idée et ne fonctionnera pas dans le mode strict de ECMAScript Fifth Edition. Si vous souhaitez libérer une référence à quelque chose afin qu'il puisse être collecté, il serait plus habituel de dire variable = null.

Eh bien, vous finiriez avec un élément dans votre objet qui contient la valeur undefined . La clé ne serait pas disparue.