Wie kann ich in JavaScript nach einer undefinierten oder Null-Variablen suchen?

500

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_variabledefiniert 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?

Tomas Vana
quelle
46
if(some_variable) { ... }wird nicht ausgeführt, wenn some_variableist falseoder 0oder ...
kennytm
guter Punkt;) Aber nehmen wir an, ich weiß, dass es nicht falsch oder 0 sein kann und ich möchte nur überprüfen, ob ich es in einer Logik verwenden kann (als String, Array usw.)
Tomas Vana
Siehe auch
Jørn Schou-Rode
2
... oder eine leere Zeichenfolge.
David gegeben

Antworten:

333

Sie müssen zwischen Fällen unterscheiden:

  1. Variablen können deklariertundefined oder nicht deklariert sein . Sie erhalten eine Fehlermeldung, wenn Sie in einem anderen Kontext als auf eine nicht deklarierte Variable zugreifen typeof.
if(typeof someUndeclaredVar == whatever) // works
if(someUndeclaredVar) // throws error

Eine Variable, die deklariert, aber nicht initialisiert wurde, ist undefined.

let foo;
if (foo) //evaluates to false because foo === undefined
  1. Undefinierte Eigenschaften , wie someExistingObj.someUndefProperty. Eine undefinierte Eigenschaft gibt keinen Fehler aus und gibt einfach zurück undefined, was bei der Konvertierung in einen Booleschen Wert ausgewertet wird false. Wenn Sie sich also nicht für 0und interessieren false, ist die Verwendung if(obj.undefProp)in Ordnung. Es gibt eine gemeinsame Redewendung, die auf dieser Tatsache basiert:

    value = obj.prop || defaultValue

    Dies bedeutet "Wenn objdie Eigenschaft vorhanden ist prop, weisen Sie sie zu value, andernfalls weisen Sie den Standardwert zu defautValue".

    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 inOperators

    value = ('prop' in obj) ? obj.prop : defaultValue
user187291
quelle
1
Dann könnten Sie über hasOwnProperty und Prototypen sprechen. 'indexOf' in []! == [] .hasOwnProperty ('indexOf')
Alsciende
1
Ja, ich habe darüber nachgedacht, dies hinzuzufügen, aber beschlossen, die Vollständigkeit der Kürze halber zu opfern. ;)
user187291
52
Sie sprechen das Problem von 0 und false nicht an
TMS
12
Sie meinen nicht deklarierte Variablen. Eine Variable kann deklariert werden, hat aber immer noch den Wert undefined.
Tgr
1
Beachten Sie auch, dass typeofeine Zeichenfolge zurückgegeben wird. Also var myVar; typeof(myVar)==undefinedkehrt falsenicht zurück true.
Rism
417

Ich denke, der effizienteste Weg, um auf "Wert ist nulloder undefined" zu testen, ist

if ( some_variable == null ){
  // some_variable is either null or undefined
}

Diese beiden Zeilen sind also äquivalent:

if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}

Anmerkung 1

Wie in der Frage erwähnt, erfordert die kurze Variante, dass some_variabledeklariert 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:

function(foo){
    if( foo == null ) {...}

Suchen Sie nach Eigenschaften für ein vorhandenes Objekt

if(my_obj.foo == null) {...}

Auf der anderen Seite typeofkönnen nicht deklarierte globale Variablen behandelt werden (gibt einfach zurück undefined). 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:

if ( !some_variable ) {
  // some_variable is either null, undefined, 0, NaN, false, or an empty string
}

damit

if ( some_variable ) {
  // we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}

Notiz 3

Im Allgemeinen wird empfohlen, ===anstelle von zu verwenden ==. Die vorgeschlagene Lösung ist eine Ausnahme von dieser Regel. Die JSHint-Syntaxprüfung bietet eqnullaus diesem Grund sogar die Option.

Aus dem jQuery-Styleguide :

Strenge Gleichheitsprüfungen (===) sollten zugunsten von == verwendet werden. Die einzige Ausnahme ist die Überprüfung auf undefiniert und null über null.

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;
mar10
quelle
1
Sehr wichtiger Unterschied (der übrigens bereits in der Frage erwähnt wurde). Deshalb benutzt jeder Typ. Entschuldigung, aber ich verstehe nicht, wo Ihre Antwort nützlich ist. Sie geben nur an, was in der Frage gesagt wurde, und in den ersten Zeilen geben Sie an, dass es sogar falsch ist.
TMS
33
Sorry, aber ich muss nicht zustimmen ;-) Die Verwendung == nullist 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 wie if( o.foo == null).
10. März
1
@ mar10 (aUndefinedVar == null) gibt den Fehler "aUndefinedVar ist nicht definiert" nicht wahr aus.
Rannnn
7
Vielen Dank für diese prägnante Option. In 99% meines Codes muss nicht zwischen null und undefiniert unterschieden werden, daher führt die Kürze dieser Prüfung zu weniger überladenem Code.
Ian Lovejoy
1
Verwenden Sie, um einen ReferenceError beim Überprüfen einer globalen Variablen zu verhindern window.someProperty == null. Für lokale Variablen können Sie leicht sicherstellen, dass sie deklariert sind: anstatt schreiben zu if (...) {var local = ""}schreibenvar local; if (...) { local = ""; }
Aloso
66

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');

JS Gleichheit

Semra
quelle
4
NaN nicht gleich Nan?
Sharjeel Ahmed
2
@monotheist NaN ist nicht gleich NaN (siehe NaN-Seite von MDN ). Javascript verwendet IEEE-754 als Gleitkomma, das dieses Verhalten angibt. Es gibt einige Gedanken dazu, siehe stackoverflow.com/a/23666623/2563765
Steven
1
@ SharjeelAhmed Es ist mathematisch korrigiert. NaNvon der Differenzgleichung kann nie erwartet werden, dass sie gleich ist
Thaina
28

In neueren JavaScript-Standards wie ES5 und ES6 kann man nur sagen

> Boolean(0) //false
> Boolean(null)  //false
> Boolean(undefined) //false

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

if (Boolean(myvar)){
   // Do something
}

hier wird "null" oder "leere Zeichenfolge" oder "undefiniert" effizient behandelt.

Naren Yellavula
quelle
2
unterstützt bis wie ie5, warum ist das nicht bekannter!?
Himmators
12
OP wollte nur einen anderen Test als nullund undefined, andere falsche Werte sollten true zurückgeben!
Andre Figueiredo
1
Es fügt keinen Wert in einer Bedingung hinzu. Die Bedingung wird genau gleich ausgewertet und gibt immer noch false für 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.
erich2k8
> FYI das ist auch gleichbedeutend mit !! Wert, der der erste ist! negiert die Wahrhaftigkeit. Welches FYI auch äquivalent zu if (var)dem ist, wird zu booleschen, also im Grunde völlig nutzlos gegossen ...
Cyril CHAPON
2
Während buchstäblich mit dem Schlüsselwort nicht definiert , 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"
Stephen P
22

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:

 if (typeof(myObj.some_property) != "undefined" && myObj.some_property != null)

zu

if (myObj.some_property != null)

Vor diesem Hintergrund und angesichts der Tatsache, dass auf globale Variablen als Eigenschaften des globalen Objekts zugegriffen werden kann ( windowim Fall eines Browsers), können Sie für globale Variablen Folgendes verwenden:

if (window.some_variable != null) {
    // Do something with some_variable
}

In lokalen Bereichen ist es immer nützlich, sicherzustellen, dass Variablen oben in Ihrem Codeblock deklariert sind. Dies spart bei wiederkehrenden Verwendungen von typeof.

Andy E.
quelle
11
Sie werden NaN, 0, "" und false vermissen, da sie weder null noch undefiniert sind, sondern auch falsch.
Andreas Köberle
@ Andreas Köberle ist richtig. Sogar der nicht strenge Gleichheitsoperator sagt, dass null sich von NaN, 0, "" und false unterscheidet. Sie müssten tun if (myObj.some_property != null), um ein gleichwertiges Verhalten zu erreichen.
Thejoshwolfe
15

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)testet nulloder haben undefinedsollte:

 test(null)         => true
 test(undefined)    => true
 test(0)            => false
 test(1)            => false
 test(true)         => false
 test(false)        => false
 test('s')          => false
 test([])           => false

Mal sehen, welche der Ideen hier tatsächlich unseren Test bestehen.

Diese Arbeit:

val == null
val === null || val === undefined
typeof(val) == 'undefined' || val == null
typeof(val) === 'undefined' || val === null

Diese funktionieren nicht:

typeof(val) === 'undefined'
!!val

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 == nullTest die beste Leistung zu liefern. Es ist auch so ziemlich das kürzeste. Der Test kann negiert werden, val != nullwenn Sie die Ergänzung wünschen.

Drew Noakes
quelle
12

Dies ist der einzige Fall, in dem ==verwendet werden sollte:

if (val == null) console.log('val is null or undefined')
Yukulélé
quelle
3
Diese Antwort aus dem Jahr 2019 hat einen Mangel an positiven Stimmen, aber es ist die KISS-Antwort für diesen Anwendungsfall. Auch val != nullfür das Gegenteil, nur eine = und da es pro @Yukulele die EINZIGE ist, ==wissen Sie, was passiert, wenn Sie es sehen.
DKebler
7

Da es keine vollständige und korrekte Antwort gibt, werde ich versuchen, Folgendes zusammenzufassen:

Im Allgemeinen ist der Ausdruck:

if (typeof(variable) != "undefined" && variable != null)

kann nicht vereinfacht werden, da das variablemöglicherweise nicht deklariert ist, so dass das Weglassen des typeof(variable) != "undefined"zu ReferenceError führen würde. Aber, können Sie den Ausdruck entsprechend dem Kontext vereinfachen :

Wenn das variableist global , können Sie vereinfachen:

if (window.variable != null)

Wenn es lokal ist , können Sie wahrscheinlich Situationen vermeiden, in denen diese Variable nicht deklariert ist, und auch vereinfachen, um:

if (variable != null)

Wenn es sich um eine Objekteigenschaft handelt , müssen Sie sich keine Gedanken über ReferenceError machen:

if (obj.property != null)
TMS
quelle
Ist ein navigatorTeil von window? Können wir navigator is not definedden window.navigator != nullTest verwenden, wenn wir eine Ausnahme für bekommen ?
JWW
5

Sie können einfach überprüfen, ob die Variable einen Wert hat oder nicht. Bedeutung,

if( myVariable ) {
//mayVariable is not :
//null
//undefined
//NaN
//empty string ("")
//0
//false

}

Wenn Sie nicht wissen, ob eine Variable vorhanden ist (dh wenn sie deklariert wurde), wenden Sie sich an den Operator typeof. z.B

if( typeof myVariable !== 'undefined' ) {
    // myVariable will get resolved and it is defined
}
DDave
quelle
4

Ich habe dies mit dieser Methode gemacht

Speichern Sie die ID in einer Variablen

var someVariable = document.getElementById("someId");

Verwenden Sie dann die if-Bedingung

if(someVariable === ""){
 //logic
} else if(someVariable !== ""){
 //logic
}
Mab Kiani
quelle
3

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 (!!).

!!window['bleh'];

Dies würde ein false zurückgeben, solange bleh nicht deklariert wurde UND ein Wert zugewiesen wurde.

Farax
quelle
3

Hier ist eine andere Möglichkeit, die Array include () -Methode zu verwenden:

[undefined, null].includes(value)
Jason
quelle
Es funktioniert nicht! ReferenceError: Wert ist nicht definiert
Sébastien Temprado
1
Dies sollte der Wert sein, den Sie überprüfen möchten.
a2441918
3

Dies ist ein Beispiel für eine sehr seltene Gelegenheit, bei der empfohlen wird, ==anstelle von zu verwenden ===. Der Ausdruck somevar == nullgibt für undefinedund true zurück null, 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 !=Bediener null, da dies fast immer das gewünschte Verhalten ist.

Häufigste Vergleiche:

undeffinedVar == null     // true
obj.undefinedProp == null // true
null == null              // true
0 == null                 // false
'0' == null               // false
'' == null                // false

Versuch es selber:

let undefinedVar;
console.table([
    { test : undefinedVar,     result: undefinedVar     == null },
    { test : {}.undefinedProp, result: {}.undefinedProp == null },
    { test : null,             result: null             == null },
    { test : false,            result: false            == null },
    { test : 0,                result: 0                == null },
    { test : '',               result: ''               == null },
    { test : '0',              result: '0'              == null },
]);
Sabo
quelle
2

Was auch immer yyy undefiniert oder null ist, es wird true zurückgeben

if (typeof yyy == 'undefined' || !yyy) {
    console.log('yes');
} else {
    console.log('no');
}

Ja

if (!(typeof yyy == 'undefined' || !yyy)) {
    console.log('yes');
} else {
    console.log('no');
}

Nein

Terry Lin
quelle
2

Öffnen Sie die Entwicklertools in Ihrem Browser und probieren Sie einfach den im folgenden Bild gezeigten Code aus.

Img1 Img2

Akash Preet
quelle
2

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.

Geben Sie hier die Bildbeschreibung ein

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.

if (a === undefined || a === null || a==='') {
    console.log("Nothing");
} else {
    console.log("Something");
}

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.

Code-EZ
quelle
2

Ähnlich wie bei dem, was Sie haben, könnten Sie so etwas tun

if (some_variable === undefined || some_variable === null) { do stuff }

gpap
quelle
0

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)(oder if( obj.property)), um sicherzustellen, dass Ihre Variable (oder Objekteigenschaft) vorhanden ist, fehl, wenn sie mit einem booleschen falseWert definiert ist. Vorbehalt Emptor :)

lucsorel
quelle
0

Beide Werte können mit dem strengen Vergleichsoperator leicht unterschieden werden:

Arbeitsbeispiel bei:

http://www.thesstech.com/tryme?filename=nullandundefined

Beispielcode:

function compare(){
    var a = null; //variable assigned null value
    var b;  // undefined
    if (a === b){
        document.write("a and b have same datatype.");
    }
    else{
        document.write("a and b have different datatype.");
    }   
}
Sohail Arif
quelle
0

Wenn der Zweck der if-Anweisung darin besteht, vor dem Zuweisen eines Werts zu einer Variablen nach nulloder nach undefinedWerten 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).

const a = some_variable ?? '';

Dadurch wird sichergestellt , dass die Variable auf eine leere Zeichenfolge zugewiesen wird (oder einem anderen Standardwert) , wenn some_variableist nulloder undefined.

Dieser Operator eignet sich am besten für Ihren Anwendungsfall, da er nicht den Standardwert für andere Arten von Falschwerten wie 0und zurückgibt ''.

gojun
quelle
-1

Sie müssen eine Funktion dieses Formulars definieren:

validate = function(some_variable){
    return(typeof(some_variable) != 'undefined' && some_variable != null)
}
ljofre
quelle
Dadurch wird derselbe ReferenceError generiert, wenn die Variable nicht deklariert ist.
Chad
-1

Wenn Sie es in ES5 oder ES6 mehrmals überprüfen müssen, müssen Sie Folgendes tun:

const excluded = [null, undefined, ''];

if (!exluded.includes(varToCheck) {
  // it will bee not null, not undefined and not void string
}

vladernn
quelle
-1

Mit Ramda können Sie einfach R.isNil(yourValue) Lodash ausführen und andere Hilfsbibliotheken haben dieselbe Funktion.

Mark Jackson
quelle