Als ich mir heute den Prototypcode ansah, entdeckte ich den Löschoperator.
unset: function(key) {
var value = this._object[key];
delete this._object[key];
Rückgabewert;
}
Ich habe im Handbuch nachgeschaut,
Der Löschoperator löscht eine Eigenschaft aus einem Objekt oder ein Element aus einem Array.
Ausdruck löschen
Der Ausdrucksparameter ist ein gültiger JScript-Ausdruck, normalerweise ein Eigenschaftsname oder ein Array-Element.
Beschreibung Wenn das Ergebnis von expression ein Objekt ist und das in expression angegebene Attribut vorhanden ist und das Objekt das Löschen nicht zulässt, wird false zurückgegeben.
In allen anderen Fällen wird true zurückgegeben.
Es fühlt sich gut an, „Ein Element aus dem Array löschen“ zu sehen, aber nachdem ich es in ff versucht habe, scheint es, dass es nur den Wert dieses Elements löschen kann, nicht das Element selbst. Es ist jedoch möglich, eine Eigenschaft von einem Objekt zu löschen.
Ich habe erneut gegoogelt und einen Artikel gefunden, der sehr ins Detail geht. Deshalb werde ich ihn hier erneut veröffentlichen, damit ich ihn nicht vergesse:
Titel: Javascript-Variablen und Löschoperator Copyright-Erklärung: Sie können nach Belieben nachdrucken, müssen jedoch den Originalautor Charlee und den Originallink http://tech.idv2.com/2008/01/09/javascript-variables-and- angeben. löschen, wenn -operator/ und diese Anweisung erneut gedruckt werden .
Inhalt:
Ich habe gerade einen guten Artikel (ursprünglicher Link) gelesen, der eine gründliche Analyse des Löschoperators in Javascript bietet. Hier finden Sie eine kurze Einführung in den Inhalt.
Obwohl es sich um einen kleinen Löschoperator handelt, ist sein Verhalten äußerst komplex.
Javascript-Variablen
Objekt wird durch den Löschoperator gelöscht. Wenn Löschen für eine Variable ausgeführt wird, werden Attribute, die gelöscht werden können, und Attribute, die nicht gelöscht werden können, Variablen, die gelöscht werden können, und Variablen, die nicht gelöscht werden können, ausgeführt
Rückgabewert von delete
------------------------------- --- ----------------------------------
Javascript-Variablen Tatsächlich sind in Javascript Variablen = Objekteigenschaften, Dies liegt daran, dass Javascript vor der Ausführung des Skripts ein globales Objekt erstellt. Alle globalen Variablen sind Eigenschaften dieses globalen Objekts. Beim Ausführen der Funktion werden auch alle lokalen Variablen Eigenschaften dieses Aktivierungsobjekts erstellt. Beispiel:
var global = 42;this.global; // 42, Sie können über this.global2 = 12;global2; // 12function foo() { var local = 36; // auf das globale Objekt zugreifen direkter Zugriff , // Daher kann nicht über foo.local auf die lokale Variable zugegriffen werden} Das vom Löschoperator gelöschte Objekt
In C++ gibt es auch einen Löschoperator, der das Objekt löscht, auf das der Zeiger zeigt. Zum Beispiel:
// C++class Object {public: Object *x;}Object o;ox = new Object();delete ox; // Das neue Object-Objekt in der vorherigen Zeile wird freigegeben, aber das Löschen von Javascript ist anders aus C++ wird das Objekt, auf das ox zeigt, nicht gelöscht, aber das ox-Attribut selbst wird gelöscht.
// Javascriptvar o = {};ox = new Object();delete ox; // Das Object-Objekt new in der vorherigen Zeile existiert noch ox; // undefiniert, die Eigenschaft namens x von o wird im aktuellen Javascript gelöscht. Nach dem Löschen von ox wird das Objekt im Müll gesammelt, da es seine Referenz verloren hat. Daher ist das Löschen von ox „äquivalent“ zum Löschen des Objekts, auf das ox zeigt. Das heißt, diese Aktion ist kein ECMAScript-Standard. Selbst wenn eine Implementierung vollständig ist, verstößt das Nichtlöschen des Object-Objekts nicht gegen den ECMAScript-Standard.
„Attribute löschen statt Objekte löschen“ kann durch den folgenden Code bestätigt werden.
var o = {};var a = { x: 10 };oa = a;delete oa; // Das oa-Attribut wird gelöscht oa // 10, weil das Objekt { x: 10 } ist immer noch eine Referenz, daher wird es nicht recycelt. Darüber hinaus kann delete ox auch als delete o["x"] geschrieben werden, was beides den gleichen Effekt hat.
Beim Löschen einer Variablen ist die Variable auch eine Eigenschaft des Global- oder Aktivierungsobjekts, sodass der Löschvorgang für die Variable zum gleichen Ergebnis führt.
var global = 42; delete global; // Delete Global.globalfunction foo() { var local = 36; delete Activation.local} Eigenschaften, die gelöscht werden können, und Eigenschaften, die nicht gelöscht werden können löschen. Beispielsweise können im Prototyp deklarierte Eigenschaften nicht gelöscht werden:
function C() { this.x = 42; }C.prototype.x = 12;var o = new C();ox; .xdelete ox;ox; // 12, im Prototyp definiertes ox wird nicht gelöscht, auch wenn delete ox erneut ausgeführt wird. Die vordefinierten Eigenschaften des Objekts können nicht gelöscht werden. Man kann davon ausgehen, dass dieser Attributtyp die Eigenschaften von DontDelete aufweist.
var re = /abc/i;delete re.ignoreCase;re.ignoreCase; // true, discoverCase kann keine Variablen löschen, die über var deklariert werden können, und Variablen, die über die Funktion deklariert werden, haben das DontDelete-Attribut und kann nicht gelöscht werden.
var x = 36;delete x;x; // 36, x wird nicht gelöscht y = 12;delete y;y; // undefinedfunction foo() { return 42; // 42 but there Eine Ausnahme besteht darin, dass in Code, der über eval ausgeführt wird, die über var deklarierten Variablen zwar zum gleichen globalen Objekt gehören wie normale var-deklarierte Variablen, aber nicht über das DontDelete-Attribut verfügen und gelöscht werden können.
eval("var x = 36;");x; // 42delete x;x; // undefiniert Es gibt jedoch eine Ausnahme, die durch var in der Funktion im Auswertungscode definiert ist, und kann nicht gelöscht werden eval(" function() { var x = 42; delete x; return x })();"); // Rückgabewert von 42delete
„Delete“ ist ein normaler Operator und gibt „true“ oder „false“ zurück. Die Regel lautet: Wenn die Eigenschaft des gelöschten Objekts vorhanden ist und DontDelete hat, wird „false“ zurückgegeben, andernfalls wird „true“ zurückgegeben. Ein Merkmal hierbei ist, dass „true“ auch dann zurückgegeben wird, wenn das Objektattribut nicht vorhanden ist, sodass der Rückgabewert nicht vollständig mit der Frage übereinstimmt, ob der Löschvorgang erfolgreich war oder nicht.
function C() { this.x = 42; }C.prototype.y = 12;var o = new C();delete ox; // undefiniert"x" in o; / ox existiert und es gibt kein DontDelete, return truedelete oy; // trueo.y; // o selbst hat kein oy-Attribut, also return true// Von hier aus können Sie auch die Existenz der Prototypenkette sehen Die eigenen Attribute des Objekts und die Prototypattribute unterscheiden sich. delete o; // false// Global.o hat das Attribut „DontDelete“, also gibt es „falsedelete“ zurück. // „true/“ Global hat keine Eigenschaft namens „undefinedProperty“, also gibt es „truedelete“ zurück. /42 ist keine Eigenschaft und gibt daher true zurück. Einige Implementierungen lösen eine Ausnahme aus (die gegen den ECMAScript-Standard verstößt). var x = 24; delete x++; // truex; // truex;