JavaScript-Prüfung auf null vs. undefiniert und Unterschied zwischen == und ===

579
  1. Wie überprüfe ich eine Variable, ob sie nulloder ist undefinedund was ist der Unterschied zwischen nullund undefined?

  2. Was ist der Unterschied zwischen ==und ===(es ist schwierig, Google nach "===" zu durchsuchen)?

MUG4N
quelle
10
2. Der Unterschied zwischen ==und ===wird hier gut beschrieben .
Usbekjon
1. Verwenden Sie === Anstelle von == JavaScript verwendet zwei verschiedene Arten von Gleichheitsoperatoren: === | ! == und == | ! = Es wird als bewährte Methode angesehen, beim Vergleich immer den vorherigen Satz zu verwenden. "Wenn zwei Operanden vom gleichen Typ und Wert sind, erzeugt === true und! == false." - JavaScript: Die guten Teile Wenn Sie jedoch mit == und! = Arbeiten, treten bei der Arbeit mit verschiedenen Typen Probleme auf. In diesen Fällen versuchen sie erfolglos, die Werte zu erzwingen. code.tutsplus.com/tutorials/…
jasonleonhard
4
Sie können Google durchsuchen nach: "Strict Equality Operator" - der sehr relevante Ergebnisse erzielt
Danield
Nur um zu den vielen Antworten hier hinzuzufügen, dass Sie die Funktion lodash.com/docs#isNil verwenden können, um zu überprüfen, ob die Variable null oder undefiniert ist
Kfir Erez

Antworten:

936

Wie überprüfe ich eine Variable, wenn es nulloder undefined...

Ist die Variable null:

if (a === null)
// or
if (a == null) // but see note below

... aber beachten Sie, dass Letzteres auch dann zutrifft, wenn dies der Fall aist undefined.

Ist es undefined:

if (typeof a === "undefined")
// or
if (a === undefined)
// or
if (a == undefined) // but see note below

... aber beachten Sie auch hier, dass der letzte vage ist; es wird auch wahr sein, wenn es aist null.

Trotz alledem besteht die übliche Methode, diese zu überprüfen, darin, die Tatsache zu verwenden, dass sie falsch sind :

if (!a) {
    // `a` is falsey, which includes `undefined` and `null`
    // (and `""`, and `0`, and `NaN`, and [of course] `false`)
}

Dies wird durch ToBoolean in der Spezifikation definiert.

... und was ist der Unterschied zwischen nullund undefined?

Sie sind beide Werte, die normalerweise verwendet werden, um das Fehlen von etwas anzuzeigen. undefinedist der allgemeinere Wert, der als Standardwert für Variablen verwendet wird, bis ihnen ein anderer Wert zugewiesen wird, als Wert für Funktionsargumente, die beim Aufruf der Funktion nicht angegeben wurden, und als Wert, den Sie erhalten, wenn Sie ein Objekt fragen für eine Eigenschaft hat es nicht. Es kann aber auch in all diesen Situationen explizit verwendet werden. (Es gibt einen Unterschied zwischen einem Objekt ohne Eigenschaft und der Eigenschaft mit dem Wert undefined. Es gibt einen Unterschied zwischen dem Aufrufen einer Funktion mit dem Wert undefinedfür ein Argument und dem vollständigen Weglassen dieses Arguments.)

nullist etwas spezifischer als undefined: Es ist eine leere Objektreferenz. JavaScript ist natürlich lose typisiert, aber nicht alle Dinge, mit denen JavaScript interagiert, sind lose typisiert. Wenn eine API wie das DOM in Browsern eine leere Objektreferenz benötigt, verwenden wir diese nullnicht undefined. In ähnlicher Weise gibt die getElementByIdOperation des DOM eine Objektreferenz zurück - entweder eine gültige (wenn das DOM-Element gefunden wurde) oder null(falls nicht).

Interessanterweise (oder nicht) sind sie ihre eigenen Typen. Das heißt, es nullist der einzige Wert im Null-Typ und undefinedder einzige Wert im undefinierten Typ.

Was ist der Unterschied zwischen "==" und "==="

Der einzige Unterschied zwischen ihnen besteht darin, dass ==sie Zwang eingeben, um zu versuchen, die Werte in Einklang zu bringen, und dies ===nicht tun . So ist zum Beispiel "1" == 1wahr, weil "1"erzwingt 1. Ist "1" === 1aber falsch , weil die Typen nicht übereinstimmen. ( "1" !== 1ist wahr.) Der erste (echte) Schritt von ==="Sind die Typen der Operanden gleich?" und wenn die Antwort "nein" ist, ist das Ergebnis false. Wenn die Typen gleich sind, macht es genau das, was es ==macht.

Typenzwang verwendet recht komplexe Regeln und kann überraschende Ergebnisse haben (zum Beispiel "" == 0ist wahr).

Mehr in der Spezifikation:

TJ Crowder
quelle
122
Um die Antwort von TJ zu destillieren, bedeutet ===, dass Wert UND Typ gleich sind.
Slappy
13
@Slappy ::-) @ MUG4N: Ja, das stimmt. if (a) { ... }würde bedeuten "wenn awahr ist", wobei "wahr" ein Wert ungleich Null, nicht null, nicht undefiniert, nicht falsch, nicht leer ist. :-)
TJ Crowder
4
Ähm ... würde der Downvoter gerne ein nützliches Feedback dazu geben, warum dies Ihrer Meinung nach "nicht nützlich" ist (um den Tooltip der Downvote-Schaltfläche zu zitieren)?
TJ Crowder
2
@ Željko: Ich denke, Crockford könnte sich in diesem Punkt irren. Es ist wahr, dass nulles sich nicht um ein Objekt handelt , sondern um eine Objektreferenz, die "kein Objekt" bedeutet. Dies ist wichtig, da es mit vom Host bereitgestellten Schnittstellen verwendet wird, wenn sie Objektreferenzen bereitstellen, aber keine bereitstellen müssen (z. B. node.nextSiblingwann nodedas letzte Element in seinem übergeordneten Element ist oder getElementByIdwenn es kein Element mit dieser ID gibt). Die Technologie, die der Host dafür verwendet, ist möglicherweise nicht so flexibel wie JavaScript in nullBezug auf Variablen- / Eigenschaftstypen. Daher war es erforderlich, ein obj ref (im Gegensatz zu undefined) zu haben.
TJ Crowder
2
Ich muss zustimmen, dass Crockford sich irrt. typeof nullDie Rückgabe von "Objekt" ist sinnvoll. Der einzige andere Wert, der Sinn machen würde, wäre "null", da er definitiv etwas anderes zurückgeben sollte als typeof undefined. null stellt eine Null-Objektreferenz dar, was zumindest bedeutet, dass die Variable, die sie enthält, für eine Art von 'Objekt' bestimmt ist. Wenn es ein Fehler war, war es ein guter Fehler. In Bezug auf die Antwort ist der Tipp zu undefined! == undefinedbeim Cross-Window-Scripting gut zu wissen, insbesondere für Debugging-Zwecke.
Triynko
93

Der Unterschied ist subtil.

In JavaScript ist eine undefinedVariable eine Variable, die nie deklariert oder nie mit einem Wert versehen wurde. Angenommen, Sie deklarieren var a;zum Beispiel, dann awird es sein undefined, weil ihm nie ein Wert zugewiesen wurde.

Aber wenn man dann zuweisen a = null;dann awird jetzt sein null. In JavaScript nullist ein Objekt (versuchen Sie es typeof nullin einer JavaScript-Konsole, wenn Sie mir nicht glauben), was bedeutet, dass null ein Wert ist (tatsächlich ist sogar undefinedein Wert).

Beispiel:

var a;
typeof a;     # => "undefined"

a = null;
typeof null;  # => "object"

Dies kann sich in Funktionsargumenten als nützlich erweisen. Möglicherweise möchten Sie einen Standardwert haben, halten jedoch null für akzeptabel. In welchem ​​Fall können Sie tun:

function doSomething(first, second, optional) {
    if (typeof optional === "undefined") {
        optional = "three";
    }
    // do something
}

Wenn Sie den optionalParameter doSomething(1, 2) thenoptional weglassen, ist dies die "three"Zeichenfolge. Wenn Sie jedoch übergeben, doSomething(1, 2, null)ist optional null.

Was die gleichen ==und streng gleichen ===Komparatoren betrifft, so ist der erste schwach typisiert, während streng gleich auch die Art der Werte überprüft. Das heißt, das 0 == "0"wird wahr zurückkehren; while 0 === "0"gibt false zurück, da eine Zahl keine Zeichenfolge ist.

Sie können diese Operatoren verwenden, um zwischen undefinedeinem zu prüfen null. Zum Beispiel:

null === null            # => true
undefined === undefined  # => true
undefined === null       # => false
undefined == null        # => true

Der letzte Fall ist interessant, da Sie damit überprüfen können, ob eine Variable entweder undefiniert oder null ist und sonst nichts:

function test(val) {
    return val == null;
}
test(null);       # => true
test(undefined);  # => true
Julien Portalier
quelle
1
Kyle Simpson behauptet, der Typ von null, der "Objekt"
zurückgibt,
15

Die Spezifikation ist der Ort, an dem Sie vollständige Antworten auf diese Fragen erhalten. Hier ist eine Zusammenfassung:

  1. Für eine Variable xkönnen Sie:

    • Überprüfen Sie, ob es sich nullum einen direkten Vergleich mit handelt ===. Beispiel:x === null
    • Überprüfen Sie, ob es sich undefinedum eine von zwei grundlegenden Methoden handelt: direkten Vergleich mit undefinedoder typeof. Aus verschiedenen Gründen bevorzuge ich typeof x === "undefined".
    • überprüfen , ob es eine von nullund undefinedmit Hilfe ==und auf den leicht obskuren Art Zwang Regeln verlassen , dass Mittel x == nullgenau das tun , was Sie wollen.

  2. Der grundlegende Unterschied zwischen ==und ===besteht darin, dass, wenn die Operanden unterschiedlichen Typs sind, ===immer zurückgegeben wird, falsewährend ==ein oder beide Operanden mithilfe von Regeln , die zu einem etwas unintuitiven Verhalten führen, in denselben Typ konvertiert werden . Wenn die Operanden vom gleichen Typ sind (z. B. sind beide Zeichenfolgen, wie im typeofobigen Vergleich) ==und ===sich genau gleich verhalten.

Lesen Sie mehr:

Tim Down
quelle
9

Wie überprüfe ich eine Variable, wenn sie null oder undefiniert ist?

Überprüfen Sie einfach, ob eine Variable einen gültigen Wert wie folgt hat:

if(variable)

es wird true zurückgeben, wenn die Variable nicht enthält:

  • Null
  • nicht definiert
  • 0
  • falsch
  • "" (eine leere Zeichenfolge)
  • NaN
Sumit Joshi
quelle
8

nicht definiert

Dies bedeutet, dass die Variable noch nicht initialisiert ist.

Beispiel:

var x;
if(x){ //you can check like this
   //code.
}

gleich (==)

Es wird nur geprüft, ob der Wert nicht dem Datentyp entspricht.

Beispiel:

var x = true;
var y = new Boolean(true);
x == y ; //returns true

Weil es nur den Wert prüft.

Strict Equals (===)

Überprüft, ob Wert und Datentyp identisch sind.

Beispiel:

var x = true;
var y = new Boolean(true);
x===y; //returns false.

Da überprüft wird, dass der Datentyp x ein primitiver Typ und y ein boolesches Objekt ist.

kannanrbk
quelle
4

Anzeige 1. nullist kein Bezeichner für eine Eigenschaft des globalen Objekts, wie es sein undefined kann

Anzeige 2. Die ===Prüfwerte und -typen. Die ==erfordern nicht die gleichen Typen und haben vor dem Vergleich (mit .valueOf()und .toString()) eine implizite Konvertierung durchgeführt . Hier haben Sie alle ( src ):

wenn

Geben Sie hier die Bildbeschreibung ein

== (seine Negation ! = )

Geben Sie hier die Bildbeschreibung ein

=== (seine Negation ! == )

Geben Sie hier die Bildbeschreibung ein

Kamil Kiełczewski
quelle
1
es ist erwähnenswert, dass document.all == nullunddocument.all !== null
ein Benutzer
1

Wenn Ihr (logische) Prüfung ist für eine Negation und wollen Sie beide JS erfassen (!) nullUnd undefined (wie verschiedene Browser finden Sie verschiedene Ergebnisse geben) Sie würde die weniger restriktive Vergleich verwenden: zB:

var ItemID = Item.get_id();
if (ItemID != null)
{
 //do stuff
}

Dies erfasst sowohl nullals auchundefined

DaniDev
quelle
0

Versuchen Sie es mit einer anderen Logik . Sie können den folgenden Code verwenden, um alle vier (4) Bedingungen für die Validierung zu überprüfen, z. B. nicht null, nicht leer, nicht undefiniert und nicht null. Verwenden Sie nur diesen Code (! (! (Variable))) in Javascript und jquery.

function myFunction() {
var data;  //The Values can be like as null, blank, undefined, zero you can test

if(!(!(data)))
{
   //If data has valid value
    alert("data "+data);
} 
else 
{
    //If data has null, blank, undefined, zero etc.
    alert("data is "+data);
}

}}

Ravikant
quelle