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.