Dans ES3, la suppression est introduite dans 8.6.2.5 et 11.4.1, comme suit
Il y a quelques informations,
1. L'opérateur de suppression dans l'implémentation appellera la méthode [[Delete]] à l'intérieur du moteur.
2. [[Supprimer]] est défini au 8.6.2
3. L'attribut supprimé a la fonctionnalité DontDelete. Si tel est le cas, false sera renvoyé directement lors de la suppression.
Recherchez « DontDelete » et vous en trouverez plusieurs. Aucun des éléments suivants ne peut être supprimé.
1. Activez l'objet arguments de l'objet (10.1.6)
Copiez le code comme suit :
fonction fonction() {
supprimer les arguments ;
alerte(arguments);
}
fonction(1);
2. Déclaration des variables (10.2.1)
Copiez le code comme suit :
var a = 10 ;
supprimer un ;
alerte(a); // 10
Cet élément est mentionné dans de nombreux livres JS, c'est-à-dire que les variables déclarées à l'aide de var ne peuvent pas être supprimées.
3. Déclaration de fonction
Copiez le code comme suit :
fonction fonction() {}
supprimer la fonction ;
alerte(func); // code fonctionnel
4. L'attribut length de la fonction
Copiez le code comme suit :
fonction fonction (a, b) {}
supprimer func.length ;
alerte(func.length); // 2
5. Quelques constantes (NaN, Infinity, non défini)
Copiez le code comme suit :
supprimer NaN ; // faux
supprimer Infinity ; // faux
supprimer non défini ; // faux
6. Prototype de constructeur intégré
Copiez le code comme suit :
supprimer Objet.prototype ; // faux
supprimer Function.prototype ; // faux
supprimer Array.prototype ; // faux
supprimer ExpReg.prototype ; // faux
supprimer Date.prototype ; // faux
supprimer Error.prototype; // faux
supprimer Number.prototype; // faux
supprimer Boolean.prototype; // faux
supprimer String.prototype ; // faux
7. La longueur des tableaux et des chaînes
Copiez le code comme suit :
var arr = [], str = 'bonjour';
supprimer arr.length; // faux
supprimer str.length; // faux
8. Propriétés de l'objet Math (Math.E, Math.LN10, Math.LN2, Math.LOG2E, Math.LOG10E, Math.PI, Math.SQRT1_2, Math.SQRT2)
Copiez le code comme suit :
supprimer Math.E; // faux
...
9. Propriétés des objets réguliers (source, global, ignoreCase, multiline, lastIndex)
Copiez le code comme suit :
var reg = /ss/;
supprimer reg.source ; // faux
...
ES5 est différent de ES3. Il n'y a pas de "DontDelete" dans ES5, mais [[Configurable]] (8.6.1) est ajouté.
Si la valeur est fausse, elle ne peut pas être supprimée. Les neuf points répertoriés ci-dessus sont décrits dans ES5 comme [[Configurable]] est faux.
La nouvelle méthode Object.defineProperty dans ES5 peut afficher le configurable de l'objet défini, comme suit
Copiez le code comme suit :
var obj = {nom : 'Jean'} ;
Objet.defineProperty(obj, "clé", {
configurable : faux,
valeur : "statique"
});
supprimer obj.name ; // vrai
supprimer obj.key // faux
L'objet obj a un nom et une clé. Le nom peut être supprimé, mais pas la clé.
De plus, en mode strict ES5, une exception sera levée directement lors de la suppression d'un objet dont le configurable est faux. comme
Copiez le code comme suit :
« utiliser strict » ;
supprimer Object.prototype ;
L'erreur de console dans FF est la suivante :
Outre certaines méthodes ou propriétés d'objets intégrés qui ne peuvent pas être supprimés, il existe également des objets personnalisés qui ne peuvent pas être supprimés. Par exemple, delete ne peut pas supprimer un objet qui hérite des propriétés du prototype.
Copiez le code comme suit :
fonction Personne() {}
Personne.prototype.name = 'John Backus';
var p = nouvelle personne ();
supprimer p.name ;
console.log(p.name); // Toujours afficher John Backus
S'il y a un nom sur ce prototype, alors après la suppression, le prototype sera affiché.
Copiez le code comme suit :
fonction Personne() {
this.name = 'John Backus';
}
Personne.prototype.name = 'John Resig';
var p = nouvelle personne ();
console.log(p.name); // John Backus
supprimer p.name ;
console.log(p.name); // John Resig, à partir du prototype
Si vous devez supprimer le nom sur le prototype, vous pouvez uniquement
Copiez le code comme suit :
supprimer Person.prototype.name
Pour résumer :
1. La plupart des propriétés et méthodes des objets intégrés ne peuvent pas être supprimées (bien que certaines puissent être supprimées, comme isNaN et parseInt)
2. Les propriétés et méthodes dont un objet hérite du prototype ne peuvent pas être supprimées.
La raison est aussi très simple,
1. La plupart des propriétés et méthodes des objets intégrés ne peuvent pas être supprimées pour protéger l'API principale du langage. Une fois ces API supprimées, elles sont fondamentalement inutiles. Comme supprimer Object.prototype.
2. Les attributs et méthodes dont un objet hérite du prototype ne peuvent pas être supprimés pour protéger le prototype. Sinon, "si un objet de classe A supprime un attribut sur le prototype, alors tous les objets hérités de A perdront l'attribut".