Aujourd'hui, en regardant le code du prototype, j'ai découvert l'opérateur delete.
non défini : fonction (clé) {
var value = this._object[clé];
supprimez this._object[key] ;
valeur de retour ;
}
J'ai vérifié le manuel,
L'opérateur delete supprime une propriété d'un objet ou un élément d'un tableau.
supprimer une expression
Le paramètre expression est une expression JScript valide, généralement un nom de propriété ou un élément de tableau.
Description Si le résultat de l'expression est un objet et que l'attribut spécifié dans l'expression existe et que l'objet ne permet pas sa suppression, false est renvoyé.
Dans tous les autres cas, renvoie vrai.
Cela fait du bien de voir "supprimer un élément du tableau", mais après l'avoir essayé dans ff, il semble qu'il ne puisse supprimer que la valeur de cet élément, pas l'élément lui-même. Il est cependant possible de supprimer une propriété d'un objet.
J'ai encore cherché sur Google et j'ai trouvé un article très détaillé, je vais donc le reposter ici pour ne pas oublier :
Titre : Variables Javascript et Déclaration de copyright de l'opérateur de suppression : Vous pouvez réimprimer à volonté, mais vous devez indiquer l'auteur original charlee et le lien original http://tech.idv2.com/2008/01/09/javascript-variables-and- supprimer lors de la réimpression de -operator/ et de cette instruction.
contenu:
Je viens de lire un bon article (lien original), qui fournit une analyse approfondie de l'opérateur de suppression en Javascript. Voici une brève introduction au contenu.
Bien qu'il s'agisse d'un petit opérateur de suppression, son comportement est extrêmement complexe.
Variables Javascript
Objet supprimé par l'opérateur delete Lorsque la suppression est exécutée sur une variable, les attributs pouvant être supprimés et les attributs ne pouvant pas être supprimés, les variables pouvant être supprimées et les variables ne pouvant pas être supprimées
Valeur de retour de la suppression
---------------------------------------------- --- ----------------------------------
Variables Javascript En fait, en Javascript, variables = propriétés de l'objet, en effet, Javascript créera un objet Global avant d'exécuter le script. Toutes les variables globales sont des propriétés de cet objet Global. Lors de l'exécution de la fonction, un objet d'Activation sera également créé. Par exemple :
var global = 42;this.global; // 42, vous pouvez accéder à l'objet Global via this.global2 = 12;global2; // 12function foo() { var local = 36; Accessible directement, // La variable locale n'est donc pas accessible via foo.local} Objet supprimé par l'opérateur delete
Il existe également un opérateur de suppression en C++, qui supprime l'objet pointé par le pointeur. Par exemple :
// C++class Object {public: Object *x;}Object o;ox = new Object();delete ox; // Le nouvel objet Object de la ligne précédente sera publié, mais la suppression de Javascript est différente. à partir de C++. L'objet pointé par ox n'est pas supprimé, mais l'attribut ox lui-même est supprimé.
// Javascriptvar o = {};ox = new Object();delete ox; // L'objet Object new dans la ligne précédente existe toujours ox; // non défini, la propriété nommée x de o est supprimée dans le Javascript actuel, Après la suppression de ox, l'objet Object sera récupéré car il a perdu sa référence. Par conséquent, la suppression de ox équivaut à la suppression de l'objet pointé par ox. Cependant, cette action n'est pas une norme ECMAScript. même si une implémentation est complètement Ne pas supprimer l'objet Object ne viole pas la norme ECMAScript.
"Supprimer des attributs au lieu de supprimer des objets" peut être confirmé par le code suivant.
var o = {};var a = { x: 10 };oa = a;delete oa; // L'attribut oa est supprimé oa; // undefineda.x; toujours une référence, elle ne sera donc pas recyclée. De plus, delete ox peut également être écrit sous la forme delete o["x"], les deux ayant le même effet.
Lors de la suppression d'une variable, la variable est également une propriété de l'objet Global ou Activation, donc l'opération de suppression sur la variable a le même résultat.
var global = 42; delete global; // Supprimer Global.globalfunction foo() { var local = 36; delete local; // Supprimer Activation.local} Propriétés pouvant être supprimées et propriétés ne pouvant pas être supprimées. supprimer. Par exemple, les propriétés déclarées dans le prototype ne peuvent pas être supprimées :
function C() { this.x = 42; C.prototype.x = 12;var o = new C();ox; .xdelete ox;ox; // 12, ox défini dans le prototype ne sera pas supprimé même si delete ox est à nouveau exécuté. Les propriétés prédéfinies de l'objet ne peuvent pas être supprimées. Ce type d'attribut peut être considéré comme ayant les caractéristiques de DontDelete.
var re = /abc/i;delete re.ignoreCase;re.ignoreCase; // true, ignoreCase ne peut pas supprimer les variables qui peuvent être supprimées et les variables qui ne peuvent pas être supprimées. Les variables déclarées via var et les fonctions déclarées via function ont l'attribut DontDelete et. ne peut pas être supprimé.
var x = 36;delete x;x; // 36, x n'est pas supprimé y = 12;delete y;y; // undefinedfunction foo() { return 42; }delete foo;foo( // 42); is Une exception est que dans le code exécuté via eval, bien que les variables déclarées via var appartiennent au même objet Global que les variables normales déclarées par var, elles n'ont pas l'attribut DontDelete et peuvent être supprimées.
eval("var x = 36;");x; // 42delete x;x; // undefined Mais il y a une exception. Les variables définies par var dans la fonction dans le code eval ont DontDelete et ne peuvent pas être supprimées eval(" ( function() { var x = 42; delete x; return x; })();"); // Renvoie la valeur de retour de 42delete
Supprimer est un opérateur normal et renvoie vrai ou faux. La règle est la suivante : lorsque la propriété de l'objet supprimé existe et a DontDelete, elle renvoie false, sinon elle renvoie true. Une caractéristique ici est que true est renvoyé même lorsque l'attribut d'objet n'existe pas, donc la valeur de retour n'est pas complètement équivalente à la réussite ou non de la suppression.
function C() { this.x = 42; }C.prototype.y = 12;var o = new C();delete ox; // trueo.x; / ox existe et il n'y a pas de DontDelete, return truedelete oy; // trueo.y; // 12// o lui-même n'a pas d'attribut oy, donc return true// De là, vous pouvez également voir l'existence de la chaîne prototype, le les propres attributs de l'objet et les attributs du prototype sont différents delete o; // false// Global.o a l'attribut DontDelete donc il renvoie falsedelete undefinedProperty ; // true// Global n'a pas de propriété nommée undefinedProperty donc il renvoie truedelete 42 ; / 42 n'est pas une propriété donc il renvoie true . Certaines implémentations lèveront une exception (violant la norme ECMAScript) var x = 24; delete x++; // 25// Ce qui est supprimé est la valeur de retour (24) de x++, pas un attribut, donc true est renvoyé