2012-07-08 5 views
20

Ich möchte aus diesem AusdruckWie kann ich ein nicht vorhandenes JavaScript-Objekt mit undefined vergleichen, ohne einen Referenzfehler zu erhalten?

(task === undefined); 

wo task willkürlich zu kommen, um boolean ist und scheint nicht überhaupt in den Code.

Allerdings, wenn ich dies in Rhino laufen lasse, erhalte ich einen Referenzfehler. Ich will wahr

Warum werde ich nicht wahr?

Ich möchte überprüfen, ob eine bestimmte Variable definiert wurde. Wie mache ich es dann wenn das nicht klappt?

Antwort

48

verwenden:

(typeof task === "undefined") 

Wenn Sie (task === undefined) verwenden, muss Javascript um den Wert von task zu sehen finden, wenn es die gleichen wie undefined ist, aber es kann nicht den Namen nachschlagen, weil es doesn t existiert und gibt Ihnen den Referenzfehler. typeof ist insofern besonders, als es den Typ eines nicht vorhandenen Namens sicher zurückgeben kann.

+0

Vielen Dank! Warum deklariert JavaScript die Aufgabe nicht undefiniert, da sie buchstäblich undefiniert ist? – Fawkes5

+0

Wie bereits erwähnt, können Sie den Namen 'task' nicht verwenden, wenn dieser nicht definiert ist, wird eine Ausnahme ausgelöst, wie Sie gesehen haben. 'typeof' ist besonders. Und Javascript hat es undefined deklariert, es hat es geschafft, indem es den Fehler ausgelöst hat! –

+0

@ Fawkes5: Es gibt einen Unterschied zwischen "Variable existiert aber hat den Wert' undefined' "und" Variable existiert überhaupt nicht ". – nnnnnn

6

Nachtrag zu der akzeptierten Antwort zu verstehen, warum es mit einigen Beispielen nicht funktioniert, können Sie sich in einer Javascript-Konsole versuchen.

Der direkte Vergleich mit einem nicht definierten Typ funktioniert nur, wenn die Variable existiert. Unten ist die Ausgabe, die Sie aus dem Google Chrome-Browser bekommen:

> task === undefined 
    ReferenceError: task is not defined 

Wenn jedoch der Variable vorhanden ist, wird es funktionieren:

// continued from above 
> var task 
    undefined 
> task === undefined 
    true 

Dies ist der Grund, warum Sie typeof Lösung stattdessen verwenden sollten weil es in alle Fälle ohne Wurffehler arbeiten wird (und die Ausführung von JavaScript-Code bricht).

// continued from above 
> typeof notavariable === 'undefined' 
    true 
> typeof task === 'undefined' 
    true 

Beachten Sie, dass die typeof Prüfung in einigen Fällen nicht benötigen, wie zum Beispiel der Eigenschaften in einem Objektliteral:

// continued from above 
> var obj = {} 
    undefined 
> obj.test === undefined 
    true 
> obj.test = 1 
    1 
> obj.test === undefined 
    false 

Dies liegt daran, Eigenschaften in einem Objekt mehr wie Werte in einem verhaltenen assoziatives Array:

// continued from above 
> obj["test"] 
    1 
> obj["test"] === undefined 
    false 

aber man kann nicht immer sicher sein, dies ein Fall in Funktion ist, wo man keine Kontrolle über das Argument Eingang hat:

// continued from above 
> function TestFunc(arg1) { console.log(arg1) } 
    undefined 
> TestFunc(notavariable) 
    ReferenceError: notavariable is not defined 
> TestFunc(task) 
    undefined 
    undefined 
> TestFunc(obj["lol"]) 
    undefined 
    undefined 

Ich hoffe, diese Übung hilft Ihnen, die Gründe für diesen Vergleich zu verstehen.

Verwandte Themen