23 Stimmen

JavaScript: Was ist der Unterschied zwischen `if (!x)` und `if (x == null)`?

Was ist der Unterschied zwischen if (!x) y if (x == null) Das heißt, wann können ihre Ergebnisse anders sein?

60voto

Felix Kling Punkte 751464

!x wird zurückgegeben true für jeden "gefälschten" Wert (leerer String, 0 , null , false , undefined , NaN ) in der Erwägung, dass x == null wird nur zurückgegeben true si x es null ( éditer : oder anscheinend undefined (siehe unten)).

Versuchen Sie es mit x = 0 gibt es einen Unterschied.

Man kann sagen, dass der NOT-Operator ! konvertiert einen Wert in sein entgegengesetztes boolesches Äquivalent. Dies ist anders als die tatsächliche Vergleichen zwei Werte.

Wenn Sie außerdem Werte vergleichen mit == tut JavaScript Typkonvertierung was zu unerwartetem Verhalten führen kann (wie undefined == null ). Es ist besser, immer den strengen Vergleich zu verwenden === (Wert und Typ müssen identisch sein) und verwenden Sie die Typumwandlung nur, wenn Sie wirklich wissen, was Sie tun.

Etwas zu lesen:


Aktualisierung:

Für weitere Informationen über den nicht-strikten Vergleich von null y undefined (oder den Vergleich im Allgemeinen), lohnt es sich, einen Blick auf die Spezifikation . Der Vergleichsalgorithmus ist dort definiert (der Vergleich ist x == y ):

  1. Wenn Typ( x ) ist dasselbe wie Type( y ), dann
    (...)
  2. Si x es null y y es undefiniert Rückkehr wahr .
  3. Si x es undefiniert y y es null Rückkehr wahr .
  4. (...)

(...)

4voto

Wesley Murch Punkte 98097

Die Ergebnisse können unterschiedlich sein, wenn x falsch, NaN, '' (leere Zeichenkette), undefiniert (unter Verwendung des strengen Vergleichsoperators ===) oder 0 (Null) ist.

Voir Die Antwort von Felix Kling für eine hervorragende Zusammenfassung des Schriftvergleichs.

3voto

AngusC Punkte 628
if (!x) 

erzwingt x verwendet die interne Funktion ToBoolean

if (x==null)

zwingt beide Operanden mit der internen Funktion ToPrimitive (die im Allgemeinen jede Seite in eine Zahl auflöst, gelegentlich auch in eine Zeichenkette, je nach den Operanden)

Für eine vollständige Erklärung von ToBoolean vs ToPrimitive siehe http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/

2voto

justkt Punkte 14360

Angenommen, x ist eine Zeichenkette.

x = undefined;
if(!x) {
   alert("X is not a truthy value");
}
if(x == null) {
   alert("X is null");
}

x = "";
if(!x) {
   alert("X is not a truthy value");
}
if(x == null) {
   alert("X is null");
}

x = null;
if(!x) {
   alert("X is not a truthy value");
}
if(x == null) {
   alert("X is null");
}

Sie werden feststellen, dass "X ist kein wahrer Wert" in allen drei Fällen angezeigt wird, aber nur im Fall, dass X undefiniert oder null ist, wird "X ist null" angezeigt.

Wenn X ein boolescher Wert ist, dann (!x) wahr sein wird, wenn X falsch ist, aber (x == null) wird nicht sein. Bei Zahlen werden 0 und NaN als falsche Werte betrachtet, so dass nicht X wahrheitsgemäß ist.

Sehen Sie es in Aktion , einschließlich des Unterschieds zwischen == (Gleichheit durch Typumwandlung) und === (strenge Gleichheit)

1voto

Thomas Clayson Punkte 29220

!x prüft auf einen falschen Wert. Dies gilt für jeden Wert, der sich aus irgendeinem Grund zu false ausbreiten kann. Dies gilt für Permutationen von false , 0 usw. usw.

x == null ist anders, weil var x = 0 wird NICHT null sein... sondern falsch sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X