1. Variablen
Wenn es um den Löschbetreiber in JavaScript geht, sollten wir zunächst die Beziehung zwischen Variablen und Attributen in JavaScript herausfinden.
In JavaScript ist die Beziehung zwischen Variablen und Objektattributen sehr subtil und kann sogar um ein Vielfaches gleichgesetzt werden, da JavaScript ein globales Objekt erstellt, bevor das Skript ausgeführt wird, ein Fensterobjekt im Browser. Alle globalen Variablen sind Attribute dieses globalen Objekts. Bei der Ausführung der Funktion wird auch ein Aktivierungsobjekt erstellt. Alle lokalen Variablen sind Attribute dieses Aktivierungsobjekts. Sie können diesen JavaScript -Umfang und diese Schließungen kennenlernen.
Die Codekopie lautet wie folgt:
// Die im Prototyp deklarierten Attribute können nicht gelöscht werden
var global = 1;
this.global; // 1 können Sie damit auf globale Objekte zugreifen
this.global2 = 2;
Global2; // 12
Funktion foo () {
var lokal = 36;
// Auf die Aktivierung kann jedoch nicht direkt zugegriffen werden.
// Daher kann auf lokale Variable nicht über foo.local zugegriffen werden
}
Es scheint, dass Variablen den Objekteigenschaften gleichwertig sind, aber tatsächlich nicht gleich, zumindest für den Löschbetreiber. Mein Verständnis ist, dass variable Erklärungen durch VAR -Anweisungen abgeschlossen werden müssen. Globale Variablen, die nicht durch VAR -Anweisungen deklariert werden, sind alle Eigenschaften von Fensterobjekten. Dies erleichtert es leicht, die Beziehung zwischen Variablen und Objekteigenschaften zu verstehen.
2. Operator löschen
Der Löschoperator wird zum Löschen von Objekteigenschaften verwendet. Als Referenztypwerte löscht es auch die Objekteigenschaften selbst und löscht das von der Eigenschaft angegebene Objekt nicht. Wenn Sie Fragen haben, können Sie sich die Werte des Grundtyps und des Referenztyps ansehen oder den folgenden Code testen:
Die Codekopie lautet wie folgt:
var o = {};
var a = {x: 10};
oa = a;
OA löschen; // OA -Attribut wird gelöscht
console.log (oa); // undefiniert
console.log (ax); // 10, weil das Objekt {x: 10} immer noch von A verwiesen wird, sodass es nicht recycelt wird
Darüber hinaus kann Löschen ox auch als lösches o ["x"] geschrieben werden, und die Auswirkungen von beiden sind gleich.
3.. Variablen können nicht gelöscht werden
VAR- und Funktionen, die von der Funktion deklarierten Funktionen deklariert wurden, haben die DontDelete -Funktion und können nicht gelöscht werden. Globale Variablen, die nicht über VAR deklariert sind (Eigenschaften globaler Objekte)
Die Codekopie lautet wie folgt:
var global = {
A: 123,
B: {
C: 1345
}
};
global löschen; //Ungültig
console.log (global)
obj = {
A: 123
};
obj löschen; // OBJ Globale Variablen löschen, OBJ -Attribut des Fensterobjekts
console.log (obj); // obj ist nicht definiert
4. Die im Prototyp deklarierten Attribute und die mit dem Objekt gelieferten Attribute können nicht gelöscht werden.
Die im Prototyp -Prototyp deklarierten Attribute und die mit dem Objekt gelieferten Attribute (tatsächlich befinden sich diese Attribute auch im Prototyp -Prototyp), können die Eigenschaften von Dontdelete aufweisen und nicht gelöscht werden. Zum Beispiel
Die Codekopie lautet wie folgt:
// Die im Prototyp deklarierten Attribute können nicht gelöscht werden
Funktion obj () {
this.x = 1;
}
obj.prototype.x = 2;
var o = neuer obj ();
console.log (ox); // 1, OX im Konstruktor definiert
Ochsen löschen;
console.log (ox); // 2, im Prototyp definierte OX, auch wenn das Löschen von Ox erneut ausgeführt wird, wird es nicht gelöscht.
// Die mit dem Objekt gelieferten Attribute können nicht gelöscht werden
var Strings = "123456";
console.log (Strings.length); // 6
Strings löschen.Length;
console.log (Strings.length); // Es ist immer noch 6
5. Mehrere Ausnahmen nach der Bewertungserklärung
In dem von Eval ausgeführten Code, der von Var deklariert von VAR zu globalen Objekten als normal deklarierte Variablen gehört, haben sie nicht das Dontdelete -Attribut und können gelöscht werden. Die von VAR in der Funktion im Eval -Code definierten Variablen haben jedoch dontdelete und können nicht gelöscht werden.
Die Codekopie lautet wie folgt: eval ("var x = 42;");
X; // => 42
x löschen;
X; // => referenceError: x ist nicht definiert
eval ("Funktion f () {return 12;}");
F(); // => 12
F;
F(); // => referenceError: f ist nicht definiert
// In dem von Eval ausgeführten Code, obwohl die von Var deklarierte Variable zum globalen Objekt als normal deklarierte Variablen gehört, gehört
// aber sie haben nicht die dontdelete -Funktion und können gelöscht werden.
eval ("(function () {" +
"var x = 42;" +
"X löschen;" +
"Return X;" +
"}) ();")
// => 42
// Die durch VAR in der Funktion im Eval -Code definierte Variable hat dontdelete und kann nicht gelöscht werden.
6. Der Rückgabewert des Löschens
Löschen ist ein normaler Bediener und kehrt wahr oder falsch zurück. Geben Sie falsch zurück, wenn die Eigenschaft des gelöschten Objekts existiert und Dondelete hat, ansonsten wahr. Ein Feature hier ist, dass, wenn das Objektattribut nicht vorhanden ist, true zurückgibt, sodass der Rückgabewert nicht genau entspricht, ob die Löschung erfolgreich ist oder nicht.
Die Codekopie lautet wie folgt:
Funktion c () {
this.x = 42;
}
C.Prototype.y = 12;
var o = neu c ();
Ochsen löschen; // WAHR
Ochse; // undefiniert
"x" in o; // FALSCH
// ox existiert und hat nicht dontdelete, kehrt wahr zurück
Oy löschen; // WAHR
oy; // 12
// O selbst hat kein OY -Attribut, daher gibt es wahr zurück
// Von hier aus können Sie auch die Existenz der Prototypkette sehen. Die eigenen Attribute und Prototyp -Attribute des Objekts sind unterschiedlich.
o löschen; // FALSCH
// Global.o hat die Dontdelete -Funktion, also gibt es falsche zurück
undefinedProperty löschen; // WAHR
// Global hat keine Eigenschaft namens undefinedProperty.
42 löschen; // WAHR
// 42 ist keine Eigenschaft, also kehrt wahr. Einige Implementierungen werfen Ausnahmen aus (verstoßen gegen den ECMAScript -Standard)
var x = 24;
x ++ löschen; // WAHR
X; // 25
// Was gelöscht wird