2012-02-07 21 views
8

Ho un pezzo di codice che verifica l'esistenza di una variabile, utilizzando un'istruzione if come nell'esempio seguente. Ho bisogno di fare una cosa se la var è impostata, una cosa diversa se non è così. In un certo banco di prova, il var doveva essere impostato a 0, ma che è la stessa sta avendo un var impostata in JS, a quanto pare:JS: verifica l'esistenza di una var uguale a 0

var toMatch; 
toMatch = 0; 
if (!toMatch) { 
    document.write("no"); 
} else { 
    document.write(toMatch); 
} 

// html is "no" 

jsFiddle

Quindi il mio problema è, come faccio prova per una var se il suo valore è legittimamente zero. Dovrei sottolineare che nella mia funzione i valori possibili da passare sono 0-40 +.

In passato ho usato un aggiramento come impostare il valore iniziale su un numero abbastanza alto da non poter essere passato alla funzione ma a me sembra un hacker. C'è un modo migliore per farlo?

risposta

14
var toMatch; 
toMatch = 0; 
if (toMatch === 0) { // or !== if you're checking for not zero 
    document.write("no"); 
} else { 
    document.write(toMatch); 
} 

toMatch === 0 controllerà per zero.

toMatch === undefined controllerà per undefined

di uguale triple sono severe operatori di confronto per questo tipo di scenario. Vedi questa domanda benedetta: Difference between == and === in JavaScript

+0

Si noti che 'undefined' non è una parola chiave e può essere teoricamente sovrascritto. Consiglia di usare 'if (typeof (toMatch)! ==" undefined ")' o chiudere il codice su una funzione anonima con un parametro extra per 'undefined'. –

+1

Si potrebbe anche voler dire che per verificare esistenza (non necessariamente un valore specifico) si potrebbe fare: 'if (typeof toMatch! == 'undefined') {};' –

+0

Puoi anche usare '(void 0)' invece di 'indefinito' se sei veramente paranoico :) –

0

Javascript è un po 'divertente quando si tratta di valori e controlli booleani. Suggerisco di leggere su Truthy and Falsey in Javascript.

si consiglia di utilizzare l'identità dell'operatore diseguaglianza !==:

var toMatch; 
toMatch = 0; 
if (toMatch !== 0) { 
    document.write("no"); 
} else { 
    document.write(toMatch); 
} 

E 'anche interessante capire the differences between == and ===.

1

È possibile vedere se un nome non è definito con:

if (typeof bad_name === "undefined") { 
+0

type of è un operatore, NON un metodo. Dovrebbe essere 'if (typeof bad_name === undefined)' – Relic

+0

OK, corretto. Ho imparato qualcosa oggi! :) –

+0

Quando ho visto per la prima volta quella notazione ero anche tutto WTF ... ti dice un po 'di casting e se ti immergi più a fondo ti aiuterà anche con l'analisi delle proprietà. – Relic

1

Invece di

if (toMatch) 

uso

if (toMatch == null) 
+0

-1 perché dovresti sempre usare assolutamente === quando paragoni a null/non definito (parole chiave) – Relic

+1

No, 'x == null' equivale a' x === null || x === undefined'. I confronti con 'null' sono l'unico caso che dovresti usare' == '(per esempio, la guida allo stile di jQuery supporta questa pratica). Il fatto che le parole riservate siano nulle e indefinite è irrilevante. –

+0

Lo so, questo è solo pigro ... e tu stai permettendo eventuali eccezioni, a meno che questo non sia il comportamento specifico che stai cercando. Le buone pratiche JavaScript dicono sempre che l'uso è assolutamente uguale, ma ho trovato 1 o 2 posti in tutto il mio codice che è buggato in IE quindi devo usare relativamente uguale. E naturalmente jQuery sostiene questo, sono l'ultima libreria cross-browser. Ecco perché hanno una partecipazione così grande nella quota di mercato. – Relic

Problemi correlati