2014-06-25 11 views
5

Recentemente in JavaScript ho preso l'abitudine di usarePerché! == "" non è uguale a! == null

if(data !== "") 

per controllare se i dati sono nulli || non definito || stringa vuota.

Quando provo a utilizzare

if(data !== null) 
    //work here 

ReSharper genera un errore orribile con me dicendo che la

"qualificatore può essere nullo o non definito"

enter image description here

Ho aggiunto un jFiddle solo per chiarire : JsFiddle

La mia domanda è: Si tratta di un errore ReSharper o c'è qualcosa dietro questo?

+2

Se si desidera verificare la presenza di un valore 'falsey', perché non basta usare' if (i dati) {} ' – jfriend00

+0

il if (dati) non funzionerà correttamente per le versioni precedenti di IE, se i dati non sono definiti IE7 credo creerà un errore fino a – Pogrindis

+1

@ jfriend00 c'è una leggera differenza per gli array vuoti '[]! =" "-> false' ma' !! [] -> true'. –

risposta

5

In breve, uno var è null quando non punta ovunque. D'altra parte, uno è una variabile definita che punta a una variabile che contiene una stringa vuota. Questo è essenzialmente diverso.

[EDIT] Come @ jfriend00 correttamente rileva, null è un valore specifico in javascript. La differenza sarebbe quindi che null è un valore diverso da "", che è una stringa vuota e quindi non null.

Il valore corretto per un var non inizializzato è undefined.

+4

Stai molto attento con la tua definizione di 'null' qui. 'null' è un valore specifico in javascript. Una variabile SOLO contiene 'null' se è stato assegnato specificatamente tale valore. Una variabile che non è stata inizializzata sarà 'undefined', non' null'. – jfriend00

1

Null e indefinito può essere trattata nello stesso modo

if (typeof data === "undefined") restituirà true se i dati non è definito (o nullo), quindi

if (typeof data !== "undefined") 

restituirà true se i dati sono stati definiti (quindi non è nullo), allora si può controllare se è una stringa vuota,

if (data.length == 0) 

restituirà true se la stringa è vuota.

9

Prima di tutto, la tua abitudine è sbagliata. Utilizzo:

if(data !== "") 

Verificherà solo una stringa vuota. Se data è undefined o null, il blocco if verrà comunque eseguito perché !== verifica l'uguaglianza senza eseguire conversioni di tipo.

In secondo luogo, ReSharper non presenta alcun problema. Sta cercando di dirti che potresti sbagliare. if(data !== null) controllerà solo contro null. undefined e una stringa vuota restituirà true e causerà l'esecuzione del blocco.ReSharper ti avverte che puoi fare errore (perché raramente hai mai bisogno di controllare solo per null).

Basta ricordare che undefined !== null !== "". Potresti provare diverse scorciatoie menzionate, ma se vuoi davvero che il tuo codice sia completo, controlla tutti e tre. Se siete preoccupati per il codice di essere troppo lungo, spostare il controllo per un metodo di utilità:

function hasValue(var data) { 
    return (data !== undefined) && (data !== null) && (data !== ""); 
}