Die jQuery Core Style Guidelines schlagen zwei verschiedene Möglichkeiten vor, um zu überprüfen, ob eine Variable definiert ist.
- Globale Variablen:
typeof variable === "undefined"
- Lokale Variablen:
variable === undefined
- Eigenschaften:
object.prop === undefined
Warum verwendet jQuery einen Ansatz für globale Variablen und einen anderen für Lokale und Eigenschaften?
javascript
jquery
undefined
Patrick McElhaney
quelle
quelle
foo === undefined
Prüft in jQuery anhand der lokalen Kopie von undefined anstelle der globalen (window.undefined), die möglicherweise durch verrückten Code geändert wurde. Die Tatsache, dass undefiniert veränderlich ist, ist definitiv erwähnenswert und ich bin froh, dass Sie es getan haben. (+1)Antworten:
Gibt für nicht deklarierte Variablen
typeof foo
das Zeichenfolgenliteral zurück"undefined"
, während die Identitätsprüfungfoo === undefined
den Fehler "foo ist nicht definiert" auslösen würde .Bei lokalen Variablen (von denen Sie wissen , dass sie irgendwo deklariert sind) würde kein solcher Fehler auftreten, daher die Identitätsprüfung.
quelle
typeof foo; // -> "undefined"
) hinzufügen, um hervorzuheben, dass es sich um eine Zeichenfolge und nicht um den primitiven Wert handeltundefined
.Ich würde mich
typeof foo === "undefined"
überall daran halten. Das kann nie schief gehen.Ich stelle mir vor, dass jQuery die beiden verschiedenen Methoden empfiehlt, weil sie ihre eigene
undefined
Variable innerhalb der Funktion definieren , in der sich der jQuery-Code befindet, sodass diese Funktionundefined
vor Manipulationen von außen sicher ist. Ich würde mir auch vorstellen, dass irgendwo jemand die beiden unterschiedlichen Ansätze verglichen und festgestellt hat, dass diesfoo === undefined
schneller ist, und daher entschieden hat, dass dies der richtige Weg ist. [UPDATE: Wie in den Kommentaren erwähnt, ist der Vergleich mitundefined
auch etwas kürzer, was eine Überlegung sein könnte.] Der Gewinn in praktischen Situationen wird jedoch völlig unbedeutend sein: Diese Überprüfung wird niemals irgendeine Art von Engpass sein, und was auch immer Ihr Verlust ist von Bedeutung: Das Auswerten einer Eigenschaft eines Hostobjekts zum Vergleich kann einen Fehler auslösen, während atypeof
überprüfen wird nie wird.Im IE wird beispielsweise Folgendes zum Parsen von XML verwendet:
So überprüfen Sie, ob eine
loadXML
Methode sicher vorhanden ist:Andererseits:
AKTUALISIEREN
Ein weiterer Vorteil der
typeof
Prüfung, den ich vergessen habe zu erwähnen, war, dass sie auch mit nicht deklarierten Variablen funktioniert, was bei derfoo === undefined
Prüfung nicht der Fall ist und tatsächlich a auslöstReferenceError
. Vielen Dank an @LinusKleen für die Erinnerung. Zum Beispiel:Fazit: Verwenden Sie immer den
typeof
Scheck.quelle
foo === undefined
, wenn minimiert, ist wahrscheinlich so etwas wief===u
, währendtypeof foo === "undefined"
kann nur auf reduziert werdentypeof f==="undefined"
.var u = "undefined"
und reduzierentypeof f==u
, was die Dinge verbessert, aber immer noch größer ist.typeof
gegen nicht deklarierte Variablen von Vorteil ist. Wenn überhaupt, können Tippfehler leichter vorbeigehen, und ich kann nicht sehen, wann Sie den Typ der nicht deklarierten Variablen tatsächlich überprüfen möchten.Ein weiterer Grund für die Verwendung der Variablentyp:
undefined
kann neu definiert werden.Das Ergebnis von
typeof variable
kann nicht.Update : Beachten Sie, dass dies in ES5 nicht der Fall ist, da die globale
undefined
Eigenschaft nicht konfigurierbar und nicht beschreibbar ist:Es kann jedoch weiterhin von einer lokalen Variablen überschattet werden:
oder Parameter:
quelle
undefined
Eigenschaft kann in ES5 nicht neu definiert werden, kann jedoch mit einer lokalen Variablen überschattet werden.void 0
ist kürzer und sicherer.Weil
undefined
nicht immer deklariert wird, sondern jQueryundefined
in seiner Hauptfunktion deklariert . Sie verwenden den sicherenundefined
Wert also intern, aber außerhalb verwenden sie dentypeof
Stil, um sicher zu sein.quelle
Wer sich für den Leistungsgewinn von interessiert
variable === undefined
, kann hier einen Blick darauf werfen, aber es scheint nur eine Chromoptimierung zu sein.quelle
Bei lokalen Variablen
localVar === undefined
funktioniert die Überprüfung mit , da sie irgendwo im lokalen Bereich definiert wurden oder nicht als lokal betrachtet werden.Für Variablen, die nicht lokal sind und nirgendwo definiert sind, löst die Prüfung
someVar === undefined
eine Ausnahme aus: Nicht erfasster Referenzfehler: j ist nicht definiertHier ist ein Code, der klarstellt, was ich oben sage. Bitte beachten Sie die Inline-Kommentare für weitere Klarheit .
Wenn wir den obigen Code so nennen:
Die Ausgabe wäre folgende:
Wenn wir den obigen Code wie folgt aufrufen (mit einem beliebigen Wert):
Die Ausgabe wird sein:
Wenn Sie die Prüfung wie
typeof x === 'undefined'
folgt durchführen:, fragen Sie im Wesentlichen Folgendes: Bitte prüfen Sie, ob die Variablex
irgendwo im Quellcode vorhanden ist (definiert wurde). (mehr oder weniger). Wenn Sie C # oder Java kennen, wird diese Art der Überprüfung nie durchgeführt, da sie nicht kompiliert wird, wenn sie nicht vorhanden ist.<== Fiddle Me ==>
quelle
Zusammenfassung:
Im globalen Bereich möchten wir tatsächlich true zurückgeben, wenn die Variable nicht deklariert ist oder den Wert hat
undefined
:Da wir im globalen Bereich nicht 100% sicher sind, ob eine Variable deklariert ist, kann dies zu einem Referenzfehler führen. Wenn wir den
typeof
Operator für die unbekannte Variable verwenden, tritt dieses Problem nicht auf, wenn die Variable nicht deklariert ist:Dies liegt an der Tatsache, dass der
typeof
Operator die Zeichenfolge zurückgibt,undefined
wenn eine Variable nicht deklariert ist oder derzeit den Wert enthält,undefined
der genau das ist, was wir wollen.undefined
quelle
typeof a === 'undefined'
ist schneller alsa === 'undefined'
etwa 2 mal auf Knoten v6.9.1.quelle
undefined
im zweiten Teil nicht'undefined'