sprawdzanie javascript pod kątem wartości nie null

140

Poniżej znajduje się fragment kodu, z którego pobieramy wartość formularza. Przed dalszym przetwarzaniem sprawdź, czy wartość nie jest zerowa.

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");
}

Jakieś pomysły, dlaczego tak się dzieje .. ??

ria
źródło
2
CW stało się, ponieważ 6+ użytkowników edytowało pytanie.
YOU
! == zamiast! =
GetBackerZ

Odpowiedzi:

81

Dzieje się tak, ponieważ val nie jest null, ale zawiera 'null'jako ciąg.

Spróbuj sprawdzić z „null”

if ('null' != val)

Aby uzyskać wyjaśnienie, kiedy i dlaczego to działa, zobacz szczegóły poniżej .

Arsen Mkrtchyan
źródło
2
powinno być, jeśli (null! = val) jakoś nie działało z cudzysłowami
Ananda
Pan X w pytaniu, null był jak string ... Twój przypadek jest prawdopodobnie inny
Arsen Mkrtchyan
147

to załatwi sprawę za Ciebie

if (!!val) {
    alert("this is not null")
} else {
    alert("this is null")
}
użytkownik144390
źródło
22
podczas gdy technicznie to działa, podwójne not (!!) jest faux-pasem programistycznym. Jest to naprawdę odpowiednik if(val), który jest o wiele jaśniejszy do odczytania. Trzymałbym się tego (fyi Ujwal, !! val powinien również technicznie działać w C lub C ++). Zobacz tutaj wartości „prawdziwości” javascript: janosch.woschitz.org/javascript-equality-comparison
Will Buck
2
co powiesz na to, że (! Boolean (val))
thedjaney
1
!! jest tylko podwójnym minusem, więc dosłownie mówi, jeśli (wartość.istnieje). Jednak nadal podoba mi się sposób, w jaki to wygląda!
Kurai Bankusu
13
to się nie powiedzie, jeśli val = 0od tego czasu zostanie !!0oszacowane na false
punkrockpolly
4
To nie jest zwykły podwójny negatyw. To transformujący podwójny negatyw. Zasadniczo przekształcasz zmienną na wartość logiczną. Jest dużo do powiedzenia na ten temat, ale wystarczy powiedzieć, że w przypadkach, gdy zmienna jest 0, false, null, undefinedczy coś takiego, że wartość postanawia truez jednym!, Masz zamiar dostać się falsedo !!. Powinien być używany oszczędnie, jeśli w ogóle.
Guy Passy
92

Istnieją trzy sposoby sprawdzenia, czy nie ma wartości „niezerowe”. Moim zaleceniem jest użycie wersji Strict Not.

1. Ścisła nie wersja

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

Wersja Strict Not korzysta z „algorytmu ścisłego porównywania równości” http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6 . !==Ma większą wydajność, niż !=operator ścisłej równości, ponieważ algorytm porównanie nie typecast wartości.

2. Nieostra nie wersja

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

Wersja nieścisła korzysta z algorytmu „Abstrakcyjnego porównania równości” http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 . !=Ma mniejszą wydajność, niż !==operatora Ponieważ algorytm Streszczenie Równość Porównanie typecasts wartości.

3. Podwójnie nie wersja

if (!!val) { ... }

Wersja Double Not !!ma wyższą wydajność niż wersja Strict Not !==i Non-Strict Not !=( https://jsperf.com/tfm-not-null/6 ). Jednak zapisuje wartości „Falsey”, takie jak undefinedi NaNna False ( http://www.ecma-international.org/ecma-262/5.1/#sec-9.2 ), co może prowadzić do nieoczekiwanych wyników i ma gorszą czytelność, ponieważ nullnie jest wyraźnie określone.

tfmontague
źródło
To bardzo dziwne. !!valpracował dla mnie, ale val!==nullnie. Dlaczego tak jest?
TheLogicGuy
@TheLogicGuy - Jaki jest typ danych val? console.log(typeof val).
tfmontague
numer. kod usuwa „złe” wartości z tablicy (null, 0 itd.). Oto kod: pastebin.com/L7Z1BtuL
TheLogicGuy
1
@TheLogicGuy - Twój rzeczywisty problem nie ma nic wspólnego z wartością null. NaN nie filtruje poprawnie - to zawsze zwróci wartość true. To powinno działać:! (IsNaN (val) && (typeof val! == "undefined")). W Javascript jest pojęcie znane jako „Prawda” i „Fałsz”. Operator podwójnego not !!usunie więcej niż tylko null. Przekształci się NaNi również undefinedw fałsz. I dlatego tablica filtruje poprawnie, gdy używasz podwójnego operatora not !!.
tfmontague
30

Użyj, !==jak !=przeniesie Cię do świata nieprzechodnich dziwacznych tabel prawdy JavaScript.

Plynx
źródło
Chyba że chcesz konkretnie sprawdzić undefinedlub null. W którym to przypadku val != nullpowróci truedo undefinedlub nullale nie dla innych wartości falsey podobnych 0.
Eric H
8

Powinieneś używać ścisłego not equalsoperatora porównania, !==aby jeśli użytkownik wprowadził dane "null", nie dotarł do else.

Warty
źródło
1
Susan Null nie byłaby zadowolona, ​​gdyby jej imię nie zostało zaakceptowane w formularzu wprowadzania danych lol
Andez
5

Dzieje się tak prawdopodobnie dlatego, że wartość valjest w rzeczywistości ciągiem znaków, "null"a nie wartością null.

ScottyUCSD
źródło
3

To powinno działać dobrze.

   if(val!= null)
    {
       alert("value is "+val.length); //-- this returns 4
    }
    else
    {
       alert("value* is null");
    }
vkGunasekaran
źródło
2

Jeśli chcesz mieć możliwość włączenia 0 jako prawidłowej wartości:

if (!!val || val === 0) { ... }
punkrockpolly
źródło
1

To zadziała:

if (val) {
    alert("Not null");
} else {
    alert("Null");
}
MoH
źródło