Das Design der Javascript-Sprache ist nicht streng genug und wenn Sie nicht vorsichtig sind, können an vielen Stellen Fehler auftreten.
Betrachten Sie beispielsweise die folgende Situation.
Jetzt müssen wir feststellen, ob ein globales Objekt myObj existiert. Wenn es nicht existiert, deklarieren Sie es. Der in natürlicher Sprache beschriebene Algorithmus lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
if (myObj existiert nicht){
deklariere myObj;
}
Sie denken vielleicht, dass das Schreiben dieses Codes einfach ist. Tatsächlich sind die damit verbundenen grammatikalischen Probleme jedoch weitaus komplexer, als wir uns vorstellen. Juriy Zaytsev wies darauf hin, dass es mehr als 50 Möglichkeiten gibt, festzustellen, ob ein Javascript-Objekt existiert. Nur wenn Sie sich über die Implementierungsdetails der Javascript-Sprache im Klaren sind, können Sie den Unterschied zwischen ihnen erkennen.
Die erste Art zu schreiben
Intuitiv könnte man meinen, man könnte schreiben:
Kopieren Sie den Codecode wie folgt:
if (!myObj) {
myObj = { };
}
Wenn dieser Code ausgeführt wird, gibt der Browser jedoch direkt einen ReferenceError-Fehler aus, wodurch der Vorgang unterbrochen wird. Was ist los?
Wenn die if-Anweisung bestimmt, ob myObj leer ist, existiert die Variable übrigens noch nicht, sodass ein Fehler gemeldet wird. Ändern Sie es wie folgt und es wird ordnungsgemäß ausgeführt.
Kopieren Sie den Codecode wie folgt:
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. Die Javascript-Sprache lautet „Zuerst analysieren, später ausführen“. Die Variablendeklaration wurde bereits während des Parsens abgeschlossen, sodass der obige Code tatsächlich äquivalent ist zu:
Kopieren Sie den Codecode wie folgt:
var myObj;
if (!myObj) {
var myObj = { };
}
Wenn daher die if-Anweisung eine Beurteilung vornimmt, ist myObj bereits vorhanden, sodass kein Fehler gemeldet wird. Dies ist der „Hebeeffekt“ des Befehls var. Der Javascript-Interpreter „befördert“ nur Variablen, die durch den Befehl „var“ definiert wurden, und funktioniert nicht mit Variablen, die ohne Verwendung des Befehls „var“ direkt zugewiesen werden. Aus diesem Grund wird ein Fehler gemeldet, wenn „var“ nicht hinzugefügt wird.
Die zweite Art zu schreiben
Zusätzlich zum Befehl var gibt es eine weitere Umschreibung, mit der ebenfalls die richtigen Ergebnisse erzielt werden können:
Kopieren Sie den Codecode wie folgt:
if (!window.myObj) {
myObj = { };
}
Window ist das Objekt der obersten Ebene von JavaScript und alle globalen Variablen sind seine Eigenschaften. Daher ist die Bestimmung, ob myobj leer ist, gleichbedeutend mit der Bestimmung, ob das Fensterobjekt über das Attribut myobj verfügt, sodass ReferenceError-Fehler vermieden werden können, die auftreten, weil myObj nicht definiert ist. Aufgrund der Standardisierung des Codes ist es jedoch am besten, var in die zweite Zeile einzufügen:
Kopieren Sie den Codecode wie folgt:
if (!window.myObj) {
var myObj = { };
}
Oder so geschrieben:
if (!window.myObj) {
window.myObj = { };
}
Die dritte Art zu schreiben
Der Nachteil der oben genannten Schreibmethode besteht darin, dass das Fenster in einigen Betriebsumgebungen (z. B. V8, Rhino) möglicherweise kein Objekt der obersten Ebene ist. Überlegen Sie also, es wie folgt umzuschreiben:
Kopieren Sie den Codecode wie folgt:
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 verschiedenen Ausführungsumgebungen unabhängig sein kann.
Die vierte Art zu schreiben
Die obige Schreibweise ist jedoch weniger lesbar und der Zeiger ist variabel und fehleranfällig. Daher schreiben wir ihn weiter um:
Kopieren Sie den Codecode wie folgt:
var global = this;
if (!global.myObj) {
global.myObj = { };
}
Es ist viel klarer, die benutzerdefinierte Variable global zu verwenden, um das Objekt der obersten Ebene darzustellen.
Die fünfte Art zu schreiben
Sie können auch den Operator „typeof“ verwenden, um festzustellen, ob myObj definiert ist.
Kopieren Sie den Codecode wie folgt:
if (typeof myObj == "undefiniert") {
var myObj = { };
}
Dies ist derzeit die am weitesten verbreitete Methode, um festzustellen, ob ein JavaScript-Objekt vorhanden ist.
Die sechste Art zu schreiben
Da der Wert von myObj direkt undefiniert ist, wenn er definiert, aber nicht zugewiesen ist, kann die obige Schreibmethode vereinfacht werden:
Kopieren Sie den Codecode wie folgt:
if (myObj == undefiniert) {
var myObj = { };
}
Hier sind zwei Dinge zu beachten: Erstens darf das Schlüsselwort var in der zweiten Zeile nicht fehlen, da sonst ein ReferenceError auftritt. Zweitens kann undefiniert nicht mit einfachen Anführungszeichen oder doppelten Anführungszeichen hinzugefügt werden, da hier der Datentyp undefiniert verglichen wird. nicht „undefiniert“ Diese Zeichenfolge.
Die siebte Schreibweise
Die obige Schreibweise gilt auch im Fall des „exakten Vergleichs“ (===):
Kopieren Sie den Codecode wie folgt:
if (myObj === undefiniert) {
var myObj = { };
}
Die achte Schreibweise
Gemäß dem Sprachdesign von JavaScript ist undefiniert == null. Wenn Sie also vergleichen, ob myObj gleich null ist, können Sie auch das richtige Ergebnis erhalten:
Kopieren Sie den Codecode wie folgt:
if (myObj == null) {
var myObj = { };
}
Obwohl die laufenden Ergebnisse korrekt sind, ist diese Beurteilungsmethode aus semantischer Sicht jedoch falsch und sollte vermieden werden. Denn null bezieht sich auf ein leeres Objekt, dem der Wert null zugewiesen wurde, das heißt, dieses Objekt hat tatsächlich einen Wert, während sich undefiniert auf ein Objekt bezieht, das nicht existiert oder dem kein Wert zugewiesen wurde. Daher kann hier nur der „Vergleichsoperator“ (==) verwendet werden. Wird hier der „exakte Vergleichsoperator“ (===) verwendet, tritt ein Fehler auf.
Die neunte Art zu schreiben
Sie können auch den in-Operator verwenden, um zu bestimmen, ob myObj ein Attribut des Objekts der obersten Ebene ist:
Kopieren Sie den Codecode wie folgt:
if (!('myObj' im Fenster)) {
window.myObj = { };
}
Die zehnte Schreibweise
Verwenden Sie abschließend die Methode hasOwnProperty, um zu bestimmen, ob myObj eine Eigenschaft des Objekts der obersten Ebene ist:
Kopieren Sie den Codecode wie folgt:
if (!this.hasOwnProperty('myObj')) {
this.myObj = { };
}
Zusammenfassen
1. Wenn Sie nur feststellen, ob das Objekt vorhanden ist, wird empfohlen, die fünfte Schreibmethode zu verwenden.
2. Wenn Sie zusätzlich zur Existenz des Objekts auch feststellen müssen, ob das Objekt einen Nullwert 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. Um plattformübergreifend zu sein, wird empfohlen, die Verwendung von Fenstern zur Darstellung von Objekten der obersten Ebene zu vermeiden.
5. In der Javascript-Sprache werden null und undefiniert leicht verwechselt. In Fällen, in denen beide beteiligt sein können, wird empfohlen, den Operator „exakter Vergleich“ (===) zu verwenden.