In unserem JavaScript-Code verwenden wir häufig das folgende Codemuster
if (typeof(some_variable) != 'undefined' && some_variable != null)
{
// Do something with some_variable
}
Gibt es eine weniger ausführliche Methode zur Überprüfung, die den gleichen Effekt hat?
Nach einigen Foren und Literatur sollte einfach das Folgende den gleichen Effekt haben.
if (some_variable)
{
// Do something with some_variable
}
Leider wertet Firebug eine solche Anweisung als Fehler zur Laufzeit aus, wenn sie nicht some_variable
definiert ist, während die erste für sie in Ordnung ist. Ist dies nur ein (unerwünschtes) Verhalten von Firebug oder gibt es wirklich einen Unterschied zwischen diesen beiden Möglichkeiten?
javascript
null
undefined
Tomas Vana
quelle
quelle
if(some_variable) { ... }
wird nicht ausgeführt, wennsome_variable
istfalse
oder0
oder ...Antworten:
Sie müssen zwischen Fällen unterscheiden:
undefined
oder nicht deklariert sein . Sie erhalten eine Fehlermeldung, wenn Sie in einem anderen Kontext als auf eine nicht deklarierte Variable zugreifentypeof
.Eine Variable, die deklariert, aber nicht initialisiert wurde, ist
undefined
.Undefinierte Eigenschaften , wie
someExistingObj.someUndefProperty
. Eine undefinierte Eigenschaft gibt keinen Fehler aus und gibt einfach zurückundefined
, was bei der Konvertierung in einen Booleschen Wert ausgewertet wirdfalse
. Wenn Sie sich also nicht für0
und interessierenfalse
, ist die Verwendungif(obj.undefProp)
in Ordnung. Es gibt eine gemeinsame Redewendung, die auf dieser Tatsache basiert:Dies bedeutet "Wenn
obj
die Eigenschaft vorhanden istprop
, weisen Sie sie zuvalue
, andernfalls weisen Sie den Standardwert zudefautValue
".Einige Leute halten dieses Verhalten für verwirrend und argumentieren, dass es zu schwer zu findenden Fehlern führt, und empfehlen stattdessen die Verwendung des
in
Operatorsquelle
undefined
.typeof
eine Zeichenfolge zurückgegeben wird. Alsovar myVar; typeof(myVar)==undefined
kehrtfalse
nicht zurücktrue
.Ich denke, der effizienteste Weg, um auf "Wert ist
null
oderundefined
" zu testen, istDiese beiden Zeilen sind also äquivalent:
Anmerkung 1
Wie in der Frage erwähnt, erfordert die kurze Variante, dass
some_variable
deklariert wurde, andernfalls wird ein ReferenceError ausgelöst. In vielen Anwendungsfällen können Sie jedoch davon ausgehen, dass dies sicher ist:Suchen Sie nach optionalen Argumenten:
Suchen Sie nach Eigenschaften für ein vorhandenes Objekt
Auf der anderen Seite
typeof
können nicht deklarierte globale Variablen behandelt werden (gibt einfach zurückundefined
). Diese Fälle sollten jedoch aus guten Gründen auf ein Minimum reduziert werden, wie Alsciende erklärte.Anmerkung 2
Diese - noch kürzere - Variante ist nicht gleichwertig:
damit
Notiz 3
Im Allgemeinen wird empfohlen,
===
anstelle von zu verwenden==
. Die vorgeschlagene Lösung ist eine Ausnahme von dieser Regel. Die JSHint-Syntaxprüfung bieteteqnull
aus diesem Grund sogar die Option.Aus dem jQuery-Styleguide :
quelle
== null
ist imho am effizientesten, um auf 'null oder undefiniert' zu testen (das ist das Fragenthema). Dies ist keineswegs ungewöhnlich (wird in jQuery 1.9.1 43 Mal verwendet), da Sie sehr oft wissen, dass die Variable deklariert wurde - oder Sie testen auf eine Eigenschaft eines vorhandenen Objekts wieif( o.foo == null)
.window.someProperty == null
. Für lokale Variablen können Sie leicht sicherstellen, dass sie deklariert sind: anstatt schreiben zuif (...) {var local = ""}
schreibenvar local; if (...) { local = ""; }
Wenn Sie null mit normaler Gleichheit aktivieren, wird auch true für undefined zurückgegeben.
if (window.variable == null) alert('variable is null or undefined');
quelle
NaN
von der Differenzgleichung kann nie erwartet werden, dass sie gleich istIn neueren JavaScript-Standards wie ES5 und ES6 kann man nur sagen
Alle geben false zurück, ähnlich wie Pythons Überprüfung leerer Variablen. Wenn Sie also eine bedingte Logik um eine Variable schreiben möchten, sagen Sie einfach
hier wird "null" oder "leere Zeichenfolge" oder "undefiniert" effizient behandelt.
quelle
null
undundefined
, andere falsche Werte sollten true zurückgeben!0
,NaN
. Dies ist der Fall, wenn Sie die Wahrhaftigkeit eines Objekts erfassen möchten, ohne einen Verweis auf das Objekt zu behalten, damit Sie dieses Objekt speichern können und nicht ein potenziell großes Objekt. Zu Ihrer Information ist dies auch gleichbedeutend damit!!value
, dass der erste!
die Wahrhaftigkeit negiert und der zweite sie erneut negiert.if (var)
dem ist, wird zu booleschen, also im Grunde völlig nutzlos gegossen ...Boolean(undefined)
funktioniert, dass der Versuch , mit einer undefinierten Variable nicht Arbeit, und das ist der springende Punkt bei der Prüfung für null oder undefiniert tun. Dies:if (Boolean(undeclareVarName)) { console.log('yes'); } else { console.log('no'); }
löst einen ReferenceError aus, der sagt "ReferenceError: undeclareVarName ist nicht definiert"Wenn Sie versuchen, auf eine nicht deklarierte Variable zu verweisen, wird in allen JavaScript-Implementierungen ein Fehler ausgegeben.
Eigenschaften von Objekten unterliegen nicht denselben Bedingungen. Wenn keine Objekteigenschaft definiert wurde, wird kein Fehler ausgegeben, wenn Sie versuchen, darauf zuzugreifen. In dieser Situation könnten Sie also verkürzen:
zu
Vor diesem Hintergrund und angesichts der Tatsache, dass auf globale Variablen als Eigenschaften des globalen Objekts zugegriffen werden kann (
window
im Fall eines Browsers), können Sie für globale Variablen Folgendes verwenden:In lokalen Bereichen ist es immer nützlich, sicherzustellen, dass Variablen oben in Ihrem Codeblock deklariert sind. Dies spart bei wiederkehrenden Verwendungen von
typeof
.quelle
if (myObj.some_property != null)
, um ein gleichwertiges Verhalten zu erreichen.Zunächst muss klar sein, was Sie testen. JavaScript bietet alle möglichen impliziten Konvertierungen und zwei verschiedene Arten von Gleichstellungskomparatoren:
==
und===
.Eine Funktion, die folgende Eigenschaften
test(val)
testetnull
oder habenundefined
sollte:Mal sehen, welche der Ideen hier tatsächlich unseren Test bestehen.
Diese Arbeit:
Diese funktionieren nicht:
Ich habe einen jsperf-Eintrag erstellt, um die Richtigkeit und Leistung dieser Ansätze zu vergleichen . Die Ergebnisse sind vorerst nicht schlüssig, da auf verschiedenen Browsern / Plattformen nicht genügend Läufe durchgeführt wurden. Bitte nehmen Sie sich eine Minute Zeit, um den Test auf Ihrem Computer auszuführen!
Derzeit scheint der einfache
val == null
Test die beste Leistung zu liefern. Es ist auch so ziemlich das kürzeste. Der Test kann negiert werden,val != null
wenn Sie die Ergänzung wünschen.quelle
Dies ist der einzige Fall, in dem
==
verwendet werden sollte:quelle
val != null
für das Gegenteil, nur eine=
und da es pro @Yukulele die EINZIGE ist,==
wissen Sie, was passiert, wenn Sie es sehen.Da es keine vollständige und korrekte Antwort gibt, werde ich versuchen, Folgendes zusammenzufassen:
Im Allgemeinen ist der Ausdruck:
kann nicht vereinfacht werden, da das
variable
möglicherweise nicht deklariert ist, so dass das Weglassen destypeof(variable) != "undefined"
zu ReferenceError führen würde. Aber, können Sie den Ausdruck entsprechend dem Kontext vereinfachen :Wenn das
variable
ist global , können Sie vereinfachen:Wenn es lokal ist , können Sie wahrscheinlich Situationen vermeiden, in denen diese Variable nicht deklariert ist, und auch vereinfachen, um:
Wenn es sich um eine Objekteigenschaft handelt , müssen Sie sich keine Gedanken über ReferenceError machen:
quelle
navigator
Teil vonwindow
? Können wirnavigator is not defined
denwindow.navigator != null
Test verwenden, wenn wir eine Ausnahme für bekommen ?Sie können einfach überprüfen, ob die Variable einen Wert hat oder nicht. Bedeutung,
Wenn Sie nicht wissen, ob eine Variable vorhanden ist (dh wenn sie deklariert wurde), wenden Sie sich an den Operator typeof. z.B
quelle
Ich habe dies mit dieser Methode gemacht
Speichern Sie die ID in einer Variablen
Verwenden Sie dann die if-Bedingung
quelle
Wie in einer der Antworten erwähnt, können Sie Glück haben, wenn Sie über eine Variable mit globalem Geltungsbereich sprechen. Wie Sie vielleicht wissen, werden die Variablen, die Sie global definieren, dem Windows-Objekt hinzugefügt. Sie können diese Tatsache ausnutzen. Nehmen wir also an, Sie greifen auf eine Variable namens bleh zu. Verwenden Sie einfach den doppelt invertierten Operator (!!).
Dies würde ein false zurückgeben, solange bleh nicht deklariert wurde UND ein Wert zugewiesen wurde.
quelle
Hier ist eine andere Möglichkeit, die Array include () -Methode zu verwenden:
quelle
Dies ist ein Beispiel für eine sehr seltene Gelegenheit, bei der empfohlen wird,
==
anstelle von zu verwenden===
. Der Ausdrucksomevar == null
gibt fürundefined
und true zurücknull
, für alles andere jedoch false (ein Fehler, wenn die Variable nicht deklariert ist).Mit dem
!=
wird das Ergebnis wie erwartet umgedreht.Moderne Editoren warnen nicht vor der Verwendung
==
oder dem!=
Bedienernull
, da dies fast immer das gewünschte Verhalten ist.Häufigste Vergleiche:
Versuch es selber:
quelle
Was auch immer yyy undefiniert oder null ist, es wird true zurückgeben
Ja
Nein
quelle
Öffnen Sie die Entwicklertools in Ihrem Browser und probieren Sie einfach den im folgenden Bild gezeigten Code aus.
quelle
Um dies zu verstehen, analysieren wir, welchen Wert die Javascript Engine beim Konvertieren von undefined, null und '' (auch eine leere Zeichenfolge) zurückgibt. Sie können dies direkt auf Ihrer Entwicklerkonsole überprüfen.
Sie können sehen, dass alle in falsch konvertieren, was bedeutet, dass alle diese drei von Javascript ausgehen, dass es keine Existenz gibt. Sie müssen also nicht alle drei in Ihrem Code wie unten explizit überprüfen.
Ich möchte noch auf eine Sache hinweisen.
Was ist das Ergebnis von Boolean (0)?
Natürlich falsch. Dies führt zu einem Fehler in Ihrem Code, wenn 0 ein gültiger Wert in Ihrem erwarteten Ergebnis ist. Stellen Sie daher sicher, dass Sie dies überprüfen, wenn Sie den Code schreiben.
quelle
Ähnlich wie bei dem, was Sie haben, könnten Sie so etwas tun
if (some_variable === undefined || some_variable === null) { do stuff }
quelle
Das Testen von nullity (
if (value == null)
) oder non-nullity (if (value != null)
) ist weniger ausführlich als das Testen des Definitionsstatus einer Variablen.Darüber hinaus schlägt das Testen
if (value)
(oderif( obj.property)
), um sicherzustellen, dass Ihre Variable (oder Objekteigenschaft) vorhanden ist, fehl, wenn sie mit einem booleschenfalse
Wert definiert ist. Vorbehalt Emptor :)quelle
Beide Werte können mit dem strengen Vergleichsoperator leicht unterschieden werden:
Arbeitsbeispiel bei:
http://www.thesstech.com/tryme?filename=nullandundefined
Beispielcode:
quelle
Wenn der Zweck der if-Anweisung darin besteht, vor dem Zuweisen eines Werts zu einer Variablen nach
null
oder nachundefined
Werten zu suchen , können Sie den Nullish Coalescing Operator verwenden , der schließlich in JavaScript verfügbar ist, obwohl die Browserunterstützung eingeschränkt ist. Nach Angaben von caniuse werden nur 48,34% der Browser unterstützt (Stand April 2020).Dadurch wird sichergestellt , dass die Variable auf eine leere Zeichenfolge zugewiesen wird (oder einem anderen Standardwert) , wenn
some_variable
istnull
oderundefined
.Dieser Operator eignet sich am besten für Ihren Anwendungsfall, da er nicht den Standardwert für andere Arten von Falschwerten wie
0
und zurückgibt''
.quelle
Sie müssen eine Funktion dieses Formulars definieren:
quelle
Wenn Sie es in ES5 oder ES6 mehrmals überprüfen müssen, müssen Sie Folgendes tun:
quelle
Mit Ramda können Sie einfach
R.isNil(yourValue)
Lodash ausführen und andere Hilfsbibliotheken haben dieselbe Funktion.quelle