In ES3 wird das Löschen wie folgt in 8.6.2.5 und 11.4.1 eingeführt
Es gibt einige Informationen,
1. Der Löschoperator in der Implementierung ruft die Methode [[Delete]] innerhalb der Engine auf.
2. [[Löschen]] ist in 8.6.2 definiert
3. Das gelöschte Attribut verfügt über die DontDelete-Funktion. Wenn ja, wird beim Löschen direkt false zurückgegeben.
Suchen Sie nach „DontDelete“ und Sie werden feststellen, dass keines der folgenden Elemente gelöscht werden kann.
1. Aktivieren Sie das Argumentobjekt des Objekts (10.1.6).
Kopieren Sie den Codecode wie folgt:
Funktion func() {
Argumente löschen;
alarm(argumente);
}
func(1);
2. Variablendeklaration (10.2.1)
Kopieren Sie den Codecode wie folgt:
var a = 10;
a löschen;
alarm(a); // 10
Dieses Element wird in vielen JS-Büchern erwähnt, das heißt, mit var deklarierte Variablen können nicht gelöscht werden.
3. Funktionsdeklaration
Kopieren Sie den Codecode wie folgt:
Funktion func() {}
Funktion löschen;
Alert(func); // Funktionscode
4. Das Längenattribut der Funktion
Kopieren Sie den Codecode wie folgt:
Funktion func(a, b) {}
func.length löschen;
alarm(func.length); // 2
5. Einige Konstanten (NaN, Infinity, undefiniert)
Kopieren Sie den Codecode wie folgt:
NaN löschen; // falsch
delete Infinity; // false
undefiniert löschen; // false
6. Prototyp des integrierten Konstruktors
Kopieren Sie den Codecode wie folgt:
delete Object.prototype; // false
delete Function.prototype; // false
delete Array.prototype; // false
delete ExpReg.prototype; // false
date.prototype löschen; // false
delete Error.prototype; // false
delete Number.prototype; // false
delete Boolean.prototype; // false
delete String.prototype; // false
7. Die Länge von Arrays und Strings
Kopieren Sie den Codecode wie folgt:
var arr = [], str = 'Hallo';
arr.length löschen; // false
delete str.length; // false
8. Eigenschaften des Math-Objekts (Math.E, Math.LN10, Math.LN2, Math.LOG2E, Math.LOG10E, Math.PI, Math.SQRT1_2, Math.SQRT2)
Kopieren Sie den Codecode wie folgt:
delete Math.E; // false
...
9. Eigenschaften regulärer Objekte (Quelle, Global, IgnoreCase, Multiline, LastIndex)
Kopieren Sie den Codecode wie folgt:
var reg = /ss/;
reg.source löschen; // false
...
ES5 unterscheidet sich von ES3. In ES5 gibt es kein „DontDelete“, aber [[Configurable]] (8.6.1) wurde hinzugefügt.
Wenn der Wert falsch ist, kann er nicht gelöscht werden. Die neun oben aufgeführten Punkte werden in ES5 als „[[Konfigurierbar]] ist falsch“ beschrieben.
Die neue Object.defineProperty-Methode in ES5 kann das Konfigurierbare des definierten Objekts wie folgt anzeigen
Kopieren Sie den Codecode wie folgt:
var obj = {name: 'John'};
Object.defineProperty(obj, "key", {
konfigurierbar: falsch,
Wert: „statisch“
});
obj.name löschen; // true
obj.key löschen // false
Das Objekt obj hat einen Namen und einen Schlüssel. Der Name kann gelöscht werden, der Schlüssel jedoch nicht.
Darüber hinaus wird im strengen ES5-Modus direkt eine Ausnahme ausgelöst, wenn ein Objekt gelöscht wird, dessen Konfigurierbarkeit falsch ist. wie
Kopieren Sie den Codecode wie folgt:
„strikt verwenden“;
Object.prototype löschen;
Der Konsolenfehler in FF ist wie folgt:
Zusätzlich zu einigen Methoden oder Eigenschaften integrierter Objekte, die nicht gelöscht werden können, gibt es auch benutzerdefinierte Objekte, die nicht gelöscht werden können. Beispielsweise kann delete kein Objekt löschen, das Eigenschaften vom Prototyp erbt.
Kopieren Sie den Codecode wie folgt:
Funktion Person() {}
Person.prototype.name = 'John Backus';
var p = neue Person();
p.name löschen;
console.log(p.name); // Gibt weiterhin John Backus aus
Wenn darauf ein Name und ein Prototyp vorhanden sind, wird nach dem Löschen der Prototyp angezeigt.
Kopieren Sie den Codecode wie folgt:
Funktion Person() {
this.name = 'John Backus';
}
Person.prototype.name = 'John Resig';
var p = neue Person();
console.log(p.name); // John Backus
p.name löschen;
console.log(p.name); // John Resig, vom Prototyp
Wenn Sie den Namen auf dem Prototyp löschen müssen, können Sie dies nur tun
Kopieren Sie den Codecode wie folgt:
Löschen Sie Person.prototype.name
Zusammenfassend:
1. Die meisten Eigenschaften und Methoden integrierter Objekte können nicht gelöscht werden (obwohl einige gelöscht werden können, z. B. isNaN und parseInt).
2. Die Eigenschaften und Methoden, die ein Objekt vom Prototyp erbt, können nicht gelöscht werden.
Der Grund ist auch sehr einfach,
1. Die meisten Eigenschaften und Methoden integrierter Objekte können nicht gelöscht werden, um die Kern-API der Sprache zu schützen. Sobald diese APIs gelöscht werden, sind sie grundsätzlich nutzlos. Zum Beispiel Object.prototype löschen.
2. Die Attribute und Methoden, die ein Objekt vom Prototyp erbt, können nicht gelöscht werden, um den Prototyp zu schützen. Andernfalls gilt: „Wenn ein Objekt der Klasse A ein Attribut im Prototyp löscht, verlieren alle von A geerbten Objekte das Attribut.“