Es gibt viele Möglichkeiten, festzustellen, ob ein JavaScript-Objekt vorhanden ist. Allerdings können Sie nur dann den Unterschied zwischen ihnen erkennen, wenn Sie sich über die Implementierungsdetails der Javascript-Sprache im Klaren sind Es gibt ein JavaScript-Objekt.
Das Design der Javascript-Sprache ist nicht streng genug und viele Dinge werden schief gehen, wenn Sie nicht vorsichtig sind.
Nun haben wir Folgendes getan Um festzustellen, ob ein globales Objekt myObj existiert, deklarieren Sie es einfach wie folgt:
if (myObj does not exist) { declare myObj; Es ist jedoch einfach, diesen Code zu schreiben. Das grammatikalische Problem ist weitaus komplizierter, als wir uns vorgestellt haben. Es gibt mehr als 50 Möglichkeiten, festzustellen, ob ein Javascript-Objekt vorhanden ist Wenn Sie sich über die Implementierungsdetails der Javascript-Sprache im Klaren sind, können Sie den Unterschied zwischen ihnen erkennen?
{ myObj = { }; Wenn Sie diesen Code ausführen, gibt der Browser jedoch direkt einen ReferenceError-Fehler aus, der dazu führt, dass der Vorgang unterbrochen wird.
Übrigens, wenn die if-Anweisung feststellt, ob myObj leer ist, wird ein Fehler gemeldet, wenn die Variable noch nicht vorhanden ist, und sie wird korrekt ausgeführt:
if (!myObj)
{ var myObj = { };Warum gibt es nach dem Hinzufügen einer Variable keinen Fehler? Könnte es sein, dass myObj in diesem Fall bereits existiert, wenn die if-Anweisung ein Urteil fällt?
Um diese Frage zu beantworten, müssen Sie wissen, wie der Javascript-Interpreter funktioniert: „Zuerst analysieren, dann ausführen“. Der obige Code ist tatsächlich äquivalent zu:
var myObj; if (!myObj)
{ var myObj = { }; Wenn die if-Anweisung eine Beurteilung vornimmt, ist myObj bereits vorhanden und es wird kein Fehler gemeldet " des var-Befehls. Funktion. Der Javascript-Interpreter „befördert“ nur Variablen, die durch den var-Befehl definiert wurden. Er funktioniert nicht bei Variablen, die ohne Verwendung des var-Befehls direkt zugewiesen werden. Aus diesem Grund wird ein Fehler gemeldet, wenn var nicht vorhanden ist hinzugefügt.
Die zweite Schreibweise
Zusätzlich zum var-Befehl gibt es eine weitere Umschreibung, die ebenfalls das richtige Ergebnis erzielen kann:
if (!window.myObj)
{ myObj = { } ; }
window ist das Objekt der obersten Ebene von Javascript. Die Bestimmung, ob myobj leer ist, entspricht der Bestimmung, ob das Fensterobjekt über das Attribut myobj verfügt. Dadurch können ReferenceError-Fehler aufgrund undefinierter myObj vermieden werden. Aufgrund der Standardisierung des Codes ist es jedoch am besten, var:
if (!window.myObj)
{ var myObj = { }; hinzuzufügen oder es so zu schreiben :
if (!window.myObj)
{ window.myObj = { }; Die dritte Schreibweise
Der Nachteil der oben genannten Schreibweise besteht darin, dass in einigen Betriebsumgebungen (z Wie V8, Rhino) ist das Fenster möglicherweise kein Objekt der obersten Ebene:
if (!this.myObj)
{ this.myObj = { }; Auf der Ebene globaler Variablen verweist das Schlüsselwort this immer auf die Variable der obersten Ebene, sodass es von unterschiedlichen Betriebsumgebungen unabhängig sein kann
Die vierte Schreibweise
Die obige Schreibweise ist jedoch weniger lesbar und fehleranfällig. Weiteres Umschreiben:
var global = this if (! global .myObj)
{ global.myObj = { }; Verwenden Sie auch den Typeof-Operator, um zu bestimmen, ob myObj definiert ist.
if (typeof myObj == "undefined")
{ var myObj = { };🎜>Dies ist derzeit die am häufigsten verwendete Methode, um zu bestimmen, ob Es existiert ein Javascript-Objekt.
Die sechste Schreibweise
besteht darin, dass der Wert von myObj direkt gleich undefiniert ist, wenn es definiert, aber nicht zugewiesen ist. Die obige Schreibmethode kann vereinfacht werden:
if (myObj == undefiniert)
{ var myObj = { } ; Hier sind zwei Dinge zu beachten: Das Schlüsselwort var darf in der zweiten Zeile nicht fehlen, da sonst ein ReferenceError auftritt Was hier verglichen wird, ist der Datentyp undefiniert, und es handelt sich nicht um die Zeichenfolge „undefiniert“.
Die obige Schreibweise gilt weiterhin für „exakter Vergleich“ (===):
if (myObj === undefiniert)
{ var myObj = { }; , undefiniert == null, wenn Sie vergleichen, ob myObj gleich null ist, können Sie auch das richtige Ergebnis erhalten:
if (myObj = = null)
{ var myObj = { }; Das Ergebnis ist korrekt, semantisch gesehen ist diese Beurteilungsmethode falsch und sollte vermieden werden. Null bezieht sich auf etwas, dem der Wert null zugewiesen wurde. Ein leeres Objekt bedeutet, dass dieses Objekt tatsächlich einen Wert hat, während sich undefiniert auf ein Objekt bezieht, dem dieser Wert zugewiesen wurde nicht vorhanden oder hat keinen Wert zugewiesen. Daher kann hier nur der „Vergleichsoperator“ (==) verwendet werden. Wenn der „exakte Vergleichsoperator“ (===) verwendet wird, tritt ein Fehler auf.
Die neunte Schreibweise
kann auch den in-Operator verwenden, um zu bestimmen, ob myObj ein Attribut des Objekts der obersten Ebene ist:
if (! ('myObj' in window ))
{ window.myObj = { }; }
Die zehnte Schreibweise besteht darin, die Methode hasOwnProperty zu verwenden, um zu bestimmen, ob myObj eine Eigenschaft des Objekts der obersten Ebene ist:
if (! this.hasOwnProperty ('myObj') )
{ this.myObj = { };Zusammenfassung 1. Wenn Sie nur feststellen, ob das Objekt vorhanden ist, wird empfohlen, die fünfte Schreibmethode zu verwenden.
2 Um festzustellen, ob das Objekt Nullwerte hat, wird empfohlen, die erste Schreibweise zu verwenden.
3. Sofern keine besonderen Umstände vorliegen, sollten alle Variablen mit dem Befehl var deklariert werden.
4 Da es plattformübergreifend ist, wird empfohlen, die Verwendung von window zur Darstellung von Objekten der obersten Ebene zu vermeiden.
5 In der Javascript-Sprache werden null und undefiniert leicht verwechselt. In Situationen, in denen beide beteiligt sein können, wird empfohlen, zu verwenden „exakter Vergleich“-Operator (===).