Ich bin auf folgenden Code gestoßen:
function test(data) {
if (data != null && data !== undefined) {
// some code here
}
}
Ich bin etwas neu in JavaScript, aber aufgrund anderer Fragen, die ich hier gelesen habe, habe ich den Eindruck, dass dieser Code nicht viel Sinn macht.
Sie erhalten eine Fehlermeldung, wenn Sie in einem anderen Kontext als auf eine undefinierte Variable zugreifentypeof
.
Update: Die (Zitat der) Antwort oben kann irreführend sein. Es sollte "eine nicht deklarierte Variable" anstelle von "eine nicht definierte Variable" stehen .
Wie ich herausgefunden habe, werden in den Antworten von Ryan ♦ , Maerics und Nwellnhof die Variablen für die Argumente immer deklariert, selbst wenn für eine Funktion keine Argumente angegeben werden. Diese Tatsache beweist auch den ersten Punkt in der Liste unten als falsch.
Nach meinem Verständnis können die folgenden Szenarien auftreten:
Die Funktion wurde ohne Argumente aufgerufen, wodurchdata
eine undefinierte Variable erstellt und ein Fehler ausgelöst wurdedata != null
.Die Funktion wurde speziell mit
null
(oderundefined
) als Argument aufgerufen. In diesem Falldata != null
schützt sie bereits den inneren Code und macht ihn&& data !== undefined
unbrauchbar.Die Funktion wurde mit einem Nicht-Null-Argument aufgerufen. In diesem Fall werden sowohl
data != null
und als auch trivial übergebendata !== undefined
.
F: Ist mein Verständnis richtig?
Ich habe Folgendes in der Firefox-Konsole versucht:
--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true
Ich kann keinen Fall herausfinden , wo die data !== undefined
nach data != null
irgendwelcher sein könnte.
quelle
if (data)
. Es ist eine mnemonische Javascript-Methode, um zu überprüfen, ob diedata
Variable true ergibt.undefined
,null
, False, 0, leere Zeichenfolge, leere Array und (?) Objekt ohne Eigenschaften das Ergebnis falsch, der Rest ist wahr.if(data)
würde bedeuten, dass er nicht übergeben kannfalse
oder0
als Werte fürdata
.if(typeof someUndefVar == whatever) -- works
undif(someUnderVar) -- error
.data !== null && data !== undefined
, was äquivalent zudata != null
was äquivalent zu istdata != undefined
. Die erstere Form wird tendenziell bevorzugt, da sie die Bedingungen expliziter beschreibt, während es leicht zu übersehen ist, dass beidenull
undundefined
mit den beiden späteren Bedingungen überprüft werden.undefined
IMO ein Codegeruch. Es ist kein geschütztes Schlüsselwort wienull
, es ist eine Variable, die zufällig undefiniert ist. Dies ist völlig gültig und wird Ihren Code brechen:undefined = 1
Antworten:
Eine „undefinierte Variable“ unterscheidet sich vom Wert
undefined
.Eine undefinierte Variable:
Eine Variable mit dem Wert
undefined
:Wenn eine Funktion ein Argument annimmt, wird dieses Argument immer deklariert, auch wenn sein Wert lautet
undefined
, sodass kein Fehler auftritt. Sie sind recht!= null
durch , gefolgt!== undefined
nutzlos, though.quelle
data !== null && data !== undefined
würde aber Sinn machen.data != null
für beidenull
und prüfenundefined
(aber interessanterweise nur fürnull
undundefined
und nicht für die anderen falschen Werte).In JavaScript
null
handelt es sich um ein spezielles Singleton-Objekt, das hilfreich ist, um "kein Wert" zu signalisieren. Sie können dies durch Vergleich testen. Wie in JavaScript üblich, empfiehlt es sich, den===
Operator zu verwenden, um verwirrende Typenzwänge zu vermeiden:Wie @rynah erwähnt, ist "undefiniert" in JavaScript etwas verwirrend. Es ist jedoch immer sicher zu testen, ob die
typeof(x)
Zeichenfolge "undefiniert" ist, auch wenn "x" keine deklarierte Variable ist:Variablen können auch den "undefinierten Wert" haben, wenn sie nicht initialisiert werden:
Alles in allem sollte Ihr Scheck folgendermaßen aussehen:
Da die Variable "Daten" jedoch immer definiert ist, da es sich um einen formalen Funktionsparameter handelt, ist die Verwendung des Operators "typeof" nicht erforderlich und Sie können sicher direkt mit dem "undefinierten Wert" vergleichen.
Dieses Snippet bedeutet: "Wenn die Funktion mit einem Argument aufgerufen wurde, das definiert ist und nicht null ist ..."
quelle
!= null
wird für alle Werte außernull
und geltenundefined
, und wir sind sicher, dass diese Variable deklariert ist.typeof
in anderen Situationen kann es sogar gefährlich sein - was ist, wenn Sie den Variablennamen falsch eingeben? Das kann lange Zeit unentdeckt bleiben, da kein Fehler vorliegt.!=
strengen Vergleich verwenden!==
?===
) zu verwenden, es sei denn, Sie wissen wirklich, was Sie tun, und möchten einen Vergleich nach der Konvertierung (==
).undefined
. Auch Safari auf dem iPad wird dies unter keinen Umständen tun. Du kannst nicht einmaldelete window.undefined
.In Ihrem Fall verwenden
data==null
(was NUR für null und undefiniert gilt - konzentrieren Sie sich beim zweiten Bild auf Zeilen / Spalten, die nicht definiert sind)Code-Snippet anzeigen
Hier haben Sie alle ( src ):
wenn
== (seine Negation ! = )
=== (seine Verneinung ! == )
quelle
F: Die Funktion wurde ohne Argumente aufgerufen, wodurch Daten zu einer undefinierten Variablen wurden und ein Fehler bei data! = Null ausgelöst wurde.
A: Ja,
data
wird auf undefiniert gesetzt. Siehe Abschnitt 10.5 Deklarationsbindung Instanziierung der Spezifikation. Der Zugriff auf einen undefinierten Wert führt jedoch nicht zu einem Fehler. Sie verwechseln dies wahrscheinlich mit dem Zugriff auf eine nicht deklarierte Variable im strengen Modus, was einen Fehler auslöst.F: Die Funktion wurde speziell mit null (oder undefiniert) als Argument aufgerufen. In diesem Fall schützt data! = Null bereits den inneren Code und macht && data! == undefined unbrauchbar.
F: Die Funktion wurde mit einem Nicht-Null-Argument aufgerufen. In diesem Fall werden sowohl Daten! = Null als auch Daten! == undefiniert trivial übergeben.
A: Richtig. Beachten Sie, dass die folgenden Tests gleichwertig sind:
Siehe Abschnitt 11.9.3 Der abstrakte Gleichheitsvergleichsalgorithmus und Abschnitt 11.9.6 Der strikte Gleichheitsvergleichsalgorithmus der Spezifikation.
quelle
data
überhaupt nicht geben würde, anstatt darauf eingestellt zu seinundefined
. Ich schätze die Klarstellung, und diese Referenzen haben mir geholfen, genauer zu verstehen, wie beide Gleichheiten funktionieren.Ich denke, das Testen von Variablen auf Werte, die Sie nicht erwarten, ist im Allgemeinen keine gute Idee. Weil Sie den Test als Ihren betrachten können, als würden Sie eine schwarze Liste verbotener Werte schreiben. Aber was ist, wenn Sie vergessen, alle verbotenen Werte aufzulisten? Jemand, sogar Sie, kann Ihren Code knacken, indem er einen unerwarteten Wert übergibt. Ein geeigneterer Ansatz ist also so etwas wie eine Whitelist - Variablen werden nur auf die erwarteten Werte getestet, nicht unerwartet. Wenn Sie beispielsweise erwarten, dass der Datenwert stattdessen eine Zeichenfolge ist:
mach so etwas:
quelle
typeof foo === "undefined"
ist anders alsfoo === undefined
, verwirren Sie sie nie.typeof foo === "undefined"
ist was du wirklich brauchst. Verwenden Sie auch!==
anstelle von!=
So kann die Aussage geschrieben werden als
Bearbeiten:
Sie können nicht
foo === undefined
für nicht deklarierte Variablen verwenden.quelle
foo === undefined
gefährlich zu benutzen. Dadurch schlägt Ihr Code unter denselben Bedingungen fehl, die Sie verhindern wollten.foo === undefined
ist in der Situation des OP durchaus akzeptabel (vorausgesetzt, esundefined
wurde nicht überschrieben). Die Antwort erklärt auch nicht, warum!==
anstelle von verwendet werden sollte!=
.Der einfache Weg, um Ihren Test durchzuführen, ist:
quelle
data
eine Zeichenfolge ist, gibt dieser Test für leere Zeichenfolgen false zurück, was möglicherweise angemessen ist oder nicht (die Funktion möchte möglicherweise auf irgendeine Weise mit der leeren Zeichenfolge umgehen).""
oder0
oderNaN
(oder andere) haben, wird der "Wenn" -Block übersprungen; was die Absicht von OP sein kann oder nicht.quelle
null
.