controllo javascript per non null


133

Di seguito è riportato un frammento di codice, in cui recuperiamo un valore di modulo. Prima di un'ulteriore elaborazione, verificare se il valore non è null.

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

Qualche idea sul perché accada così .. ??


2
CW è successo a causa di oltre 6 utenti che hanno modificato la domanda.
TU

! == anziché! =
GetBackerZ

Risposte:


78

È perché val non lo è null, ma contiene 'null'come stringa.

Prova a verificare con 'null'

if ('null' != val)

Per una spiegazione di quando e perché funziona, vedere i dettagli di seguito .


2
dovrebbe essere se (null! = val) in qualche modo non funzionava con le virgolette
Ananda

Mr.x nella domanda, null era come stringa ... il tuo caso è probabilmente diverso
Arsen Mkrtchyan

145

questo farà il trucco per te

if (!!val) {
    alert("this is not null")
} else {
    alert("this is null")
}

22
mentre tecnicamente funziona, un doppio no (!!) è un falso passo di programmazione. È davvero l'equivalente di if(val), che è molto più chiaro da leggere. Vorrei attenermi a questo (fyi Ujwal, !! val dovrebbe funzionare tecnicamente anche in C o C ++) vedere qui per i valori di "verità" di javascript: janosch.woschitz.org/javascript-equality-comparison
Will Buck

2
che ne dici se (! Boolean (val))
thejaney

1
!! è solo un doppio negativo, quindi sta letteralmente dicendo se (val.exists). Mi piace comunque come sembra!
Kurai Bankusu,

12
ciò fallirà se, val = 0dal momento che !!0risulta falso
punkrockpolly, il

3
Non è un semplice doppio negativo. È un doppio negativo trasformante. Stai sostanzialmente trasformando la variabile in un valore booleano. C'è molto da dire su questo argomento, ma basti dire che nei casi in cui la variabile è 0, false, null, undefinedo qualcosa del genere il valore che si risolve truecon una sola!, Si sta andando ad ottenere falseper !!. Dovrebbe essere usato con parsimonia se non del tutto.
Guy Passy,

83

Esistono 3 modi per verificare "non null". La mia raccomandazione è di utilizzare la versione non rigorosa.

1. Strict Not Version

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

Strict Not Version utilizza "Algoritmo di confronto sull'uguaglianza rigorosa" http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6 . L' !==ha prestazioni più veloci, rispetto alla!= gestore perché il confronto algoritmo di uguaglianza rigorosa non si typecast valori.

2. Versione non rigida

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

La versione non rigorosa utilizza l '"algoritmo di confronto sull'uguaglianza astratta" http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 . L' !=ha prestazione più lenta, rispetto alla!== gestore perché il confronto algoritmo astratta uguaglianza typecasts valori.

3. Doppia non versione

if (!!val) { ... }

La versione Double Not !!ha prestazioni più veloci rispetto alla versione Strict Not !==e alla versione Non Strict !=( https://jsperf.com/tfm-not-null/6 ). Tuttavia, digiterà valori "Falsey" come undefinede NaNin False ( http://www.ecma-international.org/ecma-262/5.1/#sec-9.2 ) che può portare a risultati imprevisti e ha una peggiore leggibilità perché nullnon è esplicitamente dichiarato.


È molto strano. !!valha funzionato per me ma val!==nullnon l'ho fatto. Perchè
TheLogicGuy

@TheLogicGuy - Qual è il tipo di dati di val? console.log(typeof val).
tfmontague,

numero. il codice rimuove i valori "cattivi" dall'array (null, 0 ecc.). Ecco il codice: pastebin.com/L7Z1BtuL
TheLogicGuy

1
@TheLogicGuy - Il tuo vero problema non ha nulla a che fare con null. NaN non filtra correttamente - questo restituirà sempre true. Dovrebbe funzionare:! (IsNaN (val) && (typeof val! == "undefined")). In Javascript esiste un concetto noto come "Verità" e "Falsey". L'operatore double-not !!rimuoverà più di un semplice null. Si convertirà NaNe anche undefinedin falso. Ecco perché l'array filtra correttamente quando si utilizza il doppio non-operatore !!.
tfmontague,

30

Usa !==come !=ti porterà in un mondo di stranezze della tabella di verità JavaScript non transitive.


A meno che non si desideri verificare specificamente per undefinedo null. Nel qual caso val != nulltornerà trueper undefinedo nullma non per altri valori di falsità come 0.
Eric H

8

Dovresti usare il rigoroso not equals operatore di confronto!== modo che se l'utente inserisce "null", non arriverai al else.


1
Susan Null non sarebbe felice se il suo nome non fosse accettato in un modulo di inserimento dati lol
Andez

5

Probabilmente è perché il valore di valè in realtà la stringa "null"anziché il valore null.


3

Questo dovrebbe funzionare bene ..

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

2

Se vuoi essere in grado di includere 0 come valore valido:

if (!!val || val === 0) { ... }

1

Questo funzionerà:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.