70 votes

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

Le comportement de l'opérateur d'effacement semble très compliqué et il y a beaucoup de malentendus à propos de ce qu'il fait réellement. Pour moi, il semble que la réassignation quelque chose d' undefined sera plus fiable de faire ce que vous attendez.

Je n'ai jamais vu l' delete mot-clé en Javascript effectivement utilisés dans les exemples de code et je me demande si il est particulièrement utile pour quoi que ce soit. N' delete ont un but qui ne peut pas être obtenue par la réaffectation d' undefined? Est-il utilisé dans l'un des célèbres bibliothèques (par exemple, jQuery, dojo, de la colonne vertébrale, etc)?

79voto

Mike Samuel Points 54712

Ne supprimez ont un but qui ne peut pas être obtenue par la réaffectation de indéfinis?

Oui. Si vous voulez démasquer une propriété à partir d'un prototype ou causer in, hasOwnProperty, et for (...in...) pour ne pas enregistrer la propriété comme existant, 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 T. J. Crowder explique:

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

Cette matière dans son propre droit, mais il importe également lorsque vous êtes à l'aide de l'héritage, parce que 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 la prop O si O est une propriété de ce nom (même si sa valeur n'est pas définie), mais si O n'ont pas la propriété à tous, alors la valeur d'être récupérées à partir d' P.prop à la place.

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.

26voto

Eric Lippert Points 300275

Comme Mike Samuel le souligne dans sa réponse, l'une des utilisations les plus courantes de supprimer, c'est quand vous traitez un objet comme un "sac de propriété" qui associe des noms avec des valeurs. Il y a logiquement une différence entre "ce nom est maintenant connecté à certains faux valeur" et "ce nom n'est pas mappé à tous". "supprimer" permet d'atteindre le dernier.

C'est tout assez bien compris. J'ai pensé que je pourrais ajouter un intéressant historique de la note concernant l'JScript 1.0 à 5.0 moteurs.

Dans ceux d'origine de Microsoft implémentations de JScript nous avons utilisé OLE Automation de style IDispatch objets à mettre en oeuvre expando objets. IDispatch de cours fonctionne par association d'un nom avec un "id de dispatch", qui est simplement un entier. Pour invoquer dynamiquement, d'abord, vous demandez l'envoi de l'objet pour vous donner l'envoi de l'ID associé à un nom, et puis vous dire: "maintenant, il faut appeler la méthode associée à cet IDENTIFIANT, compte tenu de ces arguments".

C'est bien et bon. Mais l'une des exigences de la IDispatch contrat est que le mappage de nom d'expédition ID être stable sur l'ensemble de 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 les biens Foo est associé avec l'identificateur d'expédition 0x1234 dans cet objet. À partir de ce moment, chaque fois que l'objet est demandé pour l'identificateur d'expédition de "Toto", il faut redonner 0x1234, même si Toto est supprimé et ajouté par la suite à nouveau. Cela permet à l'appelant de maintenir leur propre fast cache de nom/dispid paires plutôt que de toujours avoir à demander à l'objet sur chaque invocation.

La conséquence pratique est que les "supprimer" n'est pas en aucune façon de réduire le fardeau de la mémoire sur l'objet dans la mise en œuvre! Lorsque vous supprimez un bien (à l'origine, la mise en œuvre), nous devons ajouter un peu de l'objet de marquage de cet identificateur d'expédition comme supprimés, mais nous devons conserver toutes les informations sur le nom/id de l'appariement dans le cas où le nom ne vient jamais en arrière. L'ajout d'un grand nombre de propriétés d'un objet et la suppression de tous les d'eux, ne craint pas l'objet en mémoire.

Le moteur JScript a bien sûr été complètement réécrit depuis mon époque (sauf, je crois, l'analyseur syntaxique et l'analyseur lexical) donc je n'ai aucune idée si le moteur a encore ce singulier caprice. Il serait intéressant de le savoir.

12voto

parapura rajkumar Points 16597

Si tu fais

  delete Foo.Bar;
 

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

  Foo.Bar = undefined
 

définit simplement la propriété Bar sur non définie et Foo.Bar existe toujours

1voto

Adel Boutros Points 6173

Vous pouvez vérifier la réponse sur le lien suivant Paramètre une variable indéfinie qui explique la différence dans une manière très détaillée.

Résumé:

Vous pouvez certainement affecter undefined, mais ce ne sera pas effacer l' variable. Seule la suppression de l'objet.propriété de l'opérateur vraiment supprime les choses.

supprimer est vraiment destiné aux propriétés plutôt que sur des variables en tant que tel. Des navigateurs vous permettent de sortir avec droit supprimer une variable, mais il est pas une bonne idée et ne fonctionne pas dans ECMAScript Cinquième Édition du strict mode. Si vous souhaitez libérer une référence à quelque chose de sorte qu'il peut être le garbage collector, il serait plus normal de dire variable= null.

0voto

James McLaughlin Points 11924

Eh bien, vous obtiendriez dans votre objet un élément contenant la valeur undefined . La clé ne serait pas partie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X