382 Stimmen

variable === undefiniert vs. typeof variable === "undefiniert"

En jQuery Core Style-Richtlinien schlagen zwei verschiedene Möglichkeiten vor, um zu prü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 Variablen und Eigenschaften?

455voto

Linus Kleen Punkte 32759

Für nicht deklarierte Variablen, typeof foo gibt das String-Literal zurück "undefined" in der Erwägung, dass die Identitätsprüfung foo === undefined würde den Fehler auslösen "foo ist nicht definiert" .

Für lokale Variablen (die Sie wissen irgendwo deklariert sind), würde kein solcher Fehler auftreten, daher die Identitätsprüfung.

143voto

Tim Down Punkte 304837

Ich würde bei der Verwendung von typeof foo === "undefined" überall. Das kann nie schiefgehen.

Ich vermute, der Grund, warum jQuery empfiehlt die beiden verschiedenen Methoden ist, dass sie ihre eigenen definieren undefined innerhalb der Funktion, in der sich der jQuery-Code befindet, so dass innerhalb dieser Funktion undefined ist vor Manipulationen von außen sicher. Ich könnte mir auch vorstellen, dass irgendjemand die beiden unterschiedlichen Ansätze miteinander verglichen hat und festgestellt hat, dass foo === undefined schneller ist und deshalb beschlossen hat, dass dies der richtige Weg ist. [UPDATE: Wie in den Kommentaren erwähnt, ist der Vergleich mit undefined ist auch etwas kürzer, was eine Überlegung wert sein könnte]. In der Praxis ist der Gewinn jedoch völlig unbedeutend: Diese Prüfung wird niemals einen Engpass darstellen, und der Verlust ist beträchtlich: Die Auswertung einer Eigenschaft eines Host-Objekts zum Vergleich kann einen Fehler auslösen, während eine typeof wird nie überprüft.

Zum Beispiel wird im IE zum Parsen von XML folgendes verwendet:

var x = new ActiveXObject("Microsoft.XMLDOM");

Um zu prüfen, ob es eine loadXML Methode sicher:

typeof x.loadXML === "undefined"; // Returns false

Andererseits:

x.loadXML === undefined; // Throws an error

UPDATE

Ein weiterer Vorteil des typeof Check, den ich vergessen habe zu erwähnen, ist, dass er auch mit nicht deklarierten Variablen funktioniert, die die foo === undefined Prüfung nicht, sondern führt zu einem ReferenceError . Danke an @LinusKleen für die Erinnerung daran. Zum Beispiel:

typeof someUndeclaredVariable; // "undefined"
someUndeclaredVariable === undefined; // throws a ReferenceError

Fazit: Verwenden Sie immer die typeof prüfen.

34voto

Jakob Punkte 23652

Ein weiterer Grund für die Verwendung der typeof-Variante: undefined kann neu definiert werden.

undefined = "foo";
var variable = "foo";
if (variable === undefined)
  console.log("eh, what?!");

Das Ergebnis von typeof variable nicht.

Update : Beachten Sie, dass dies in ES5 nicht der Fall ist, da die globale undefined ist eine nicht konfigurierbare, nicht beschreibbare Eigenschaft:

15.1.1 Werteigenschaften des globalen Objekts
[...]
15.1.1.3 undefiniert
Der Wert von undefined undefiniert ist (siehe 8.1). Diese Eigenschaft hat die Attribute
{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

Sie kann aber trotzdem von einer lokalen Variablen überschattet werden:

(function() {
  var undefined = "foo";
  var variable = "foo";
  if (variable === undefined)
    console.log("eh, what?!");  
})()

oder Parameter:

(function(undefined) {
  var variable = "foo";
  if (variable === undefined)
    console.log("eh, what?!");  
})("foo")

6voto

Struppi Punkte 103

Denn undefined wird nicht immer deklariert, aber jQuery deklariert undefined in seiner Hauptfunktion. Sie verwenden also die sichere undefined Wert intern, aber außerhalb verwenden sie den typeof Stil, um sicher zu sein.

6voto

RiZKiT Punkte 1592

Wer interessiert sich für den Leistungsgewinn von variable === undefined Hier können Sie einen Blick darauf werfen, aber es scheint nur eine Chrome-Optimierung zu sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X