Javascript-Prüfung auf nicht null

130

Unten finden Sie ein Code-Snippet, in dem wir einen Formularwert abrufen. Überprüfen Sie vor der weiteren Verarbeitung, ob der Wert nicht null ist.

var val = document.FileList.hiddenInfo.value;
alert("val is " + val);  // this prints null which is as expected
if (val != null)
{
   alert("value is "+val.length); // this returns 4
}
else
{
   alert("value* is null");
}

Irgendwelche Ideen, warum es so passiert .. ??

ria
quelle
2
CW ist passiert, weil mehr als 6 Benutzer die Frage bearbeitet haben.
SIE
! == statt! =
GetBackerZ

Antworten:

77

Es ist, weil val nicht ist null, sondern 'null'als Zeichenfolge enthält .

Versuchen Sie, mit 'null' zu überprüfen

if ('null' != val)

Eine Erklärung, wann und warum dies funktioniert, finden Sie in den folgenden Details .

Arsen Mkrtchyan
quelle
2
sollte sein, wenn (null! = val) irgendwie nicht mit den Anführungszeichen funktionierte
Ananda
Mr.x in der Frage, null war als Zeichenfolge ... Ihr Fall ist wahrscheinlich anders
Arsen Mkrtchyan
145

Dies wird den Trick für Sie tun

if (!!val) {
    alert("this is not null")
} else {
    alert("this is null")
}
Benutzer144390
quelle
22
Während dies technisch funktioniert, ist ein Double Not (!!) ein Programmier-Fauxpas. Es ist wirklich das Äquivalent von if(val), was viel klarer zu lesen ist. Ich würde Stick an , dass (FYI Ujwal, !! val sollte in C oder C ++ technisch Arbeit auch) sieht hier für javascript 'Truthiness' Werte: janosch.woschitz.org/javascript-equality-comparison
Will Buck
2
wie wäre es wenn (! Boolean (val))
thedjaney
1
!! ist nur ein doppeltes Negativ, also heißt es wörtlich, ob (val.exists). Ich mag immer noch, wie es aussieht!
Kurai Bankusu
12
Dies wird fehlschlagen, wenn val = 0seitdem !!0als falsch
Punkrockpolly
3
Es ist kein einfaches Doppel-Negativ. Es ist ein transformierendes Doppel-Negativ. Sie wandeln die Variable grundsätzlich in einen Booleschen Wert um. Es gibt eine Menge zu diesem Thema zu sagen , aber es genügt zu sagen , dass in Fällen , in denen Ihre Variable ist 0, false, null, undefinedoder einiger solcher Wert , dass Entschlüsse zu trueeinem!, Sie gehen zu bekommen falsefür !!. Es sollte, wenn überhaupt, sparsam verwendet werden.
Guy Passy
82

Es gibt 3 Möglichkeiten, um nach "nicht null" zu suchen. Meine Empfehlung ist, die Strict Not-Version zu verwenden.

1. Strict Not Version

if (val !== null) { ... }

Die Strict Not-Version verwendet den "Strict Equality Comparison Algorithm" ( http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6) . Der !==hat eine schnellere Leistung als der !=Operator, da der Algorithmus für den Vergleich strikter Gleichheit keine Werte typisiert.

2. Nicht strenge Nicht-Version

if (val != 'null') { ... }

Die nicht strikte Version verwendet den "Abstract Equality Comparison Algorithm" http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 . Der !=hat eine langsamere Leistung als der !==Operator, da der Algorithmus für den Vergleich abstrakter Gleichheit Werte typisiert.

3. Double Not Version

if (!!val) { ... }

Die Double Not-Version !!bietet eine schnellere Leistung als die Strict Not-Version !==und die Non-Strict Not-Version !=( https://jsperf.com/tfm-not-null/6 ). Es werden jedoch "Falsey" -Werte wie undefinedund NaNin False ( http://www.ecma-international.org/ecma-262/5.1/#sec-9.2 ) typisiert, was zu unerwarteten Ergebnissen führen kann, und es hat eine schlechtere Lesbarkeit, weil nullwird nicht ausdrücklich angegeben.

tfmontague
quelle
Es ist sehr seltsam. !!valhat für mich gearbeitet aber val!==nullnicht. Warum ist es?
TheLogicGuy
@TheLogicGuy - Was ist der Datentyp von val? console.log(typeof val).
tfmontague
Nummer. Der Code entfernt "schlechte" Werte aus dem Array (null, 0 usw.). Hier ist der Code: pastebin.com/L7Z1BtuL
TheLogicGuy
1
@TheLogicGuy - Ihr eigentliches Problem hat nichts mit null zu tun. NaN filtert nicht richtig - das gibt immer true zurück. Dies sollte funktionieren :! (IsNaN (val) && (typeof val! == "undefined")). In Javascript gibt es ein Konzept, das als "Truthy" und "Falsey" bekannt ist. Der Double-Not-Operator !!entfernt mehr als nur null. Es konvertiert NaNund undefinedin falsche als auch. Und deshalb filtert Ihr Array korrekt, wenn Sie den doppelten Nicht-Operator verwenden !!.
Montag,
30

Verwenden Sie !==as !=, um in eine Welt der nichttransitiven JavaScript-Wahrheitstabellen-Verrücktheit zu gelangen.

Plynx
quelle
Es sei denn, Sie möchten speziell nach undefinedoder suchen null. In diesem Fall val != nullwird truefür undefinedoder nullaber nicht für andere Falsey-Werte wie zurückgegeben 0.
Eric H
8

Sie sollten den strengen not equalsVergleichsoperator verwenden, !==damit Sie bei Eingaben des Benutzers "null"nicht zum gelangen else.

Warty
quelle
1
Susan Null würde sich nicht freuen, wenn ihr Name nicht in einem Dateneingabeformular akzeptiert würde lol
Andez
5

Dies liegt möglicherweise daran, dass der Wert von valtatsächlich "null"eher die Zeichenfolge als der Wert ist null.

ScottyUCSD
quelle
3

Dies sollte gut funktionieren ..

   if(val!= null)
    {
       alert("value is "+val.length); //-- this returns 4
    }
    else
    {
       alert("value* is null");
    }
vkGunasekaran
quelle
2

Wenn Sie 0 als gültigen Wert einschließen möchten:

if (!!val || val === 0) { ... }
Punkrockpolly
quelle
1

Das wird funktionieren:

if (val) {
    alert("Not null");
} else {
    alert("Null");
}
MoH
quelle