2013-04-25 2 views
18

Ok, quindi ho installato Linter sul mio editor Sublime mentre lavoravo alla mia app node.js. Una delle cose che ha scoperto ha detto che dovrei sempre usare! == per confrontare un oggetto con null (di solito uso! =).Javascript: Confronto con null -! == vs! =

Quindi l'ho modificato ... ma poi ho notato che! == non funzionava.

ho questo scenario:

var x = null; 
if (x !== null) 
    console.log('x is not equal to null'); 

Quando uso il == la console stampato che la linea, anche se non era ovviamente vero!. Quando l'ho commutato su! = Si è comportato normalmente.

Quindi la mia domanda è: perché è linter che mi diceva di usare! == se non fare quello che voglio che ...

So che mi manca qualcosa.


UPDATE Ok, quindi potrebbe essere un po 'più complicato di quanto inizialmente pensato. Nel mio codice reale stavo usando! == con l'oggetto GLOBAL node.js.

console.log('Global User: ' + GLOBAL.User); 

if (GLOBAL.User != null) 
{ 
    console.log('User is not null'); 
} 

Le linee stampe console anche quando GLOBAL.User è NULL ...

Forse questo oggetto è speciale?



Update 2

Ok, quindi dopo aver letto attraverso i commenti e guardando il mio codice, ho imparato che! == può avere problemi se l'oggetto non è definito, piuttosto che nulla (vedi questo post: Why is null an object and what's the difference between null and undefined?).

Quindi nel mio caso, la mia variabile globale potrebbe essere, a seconda di quando viene chiamato questo metodo, indefinito, null o pieno di dati. Ho intenzione di tornare indietro e aggiornare il mio codice in modo che non sia mai indefinito e quindi! == funzionerà in modo coerente.

Grazie per l'aiuto!


Grazie, David

+2

[funziona per me.] (Http://jsfiddle.net/zA4Du/) – 0x499602D2

+0

in grado di ripetere l'esperimento. My x === null quando faccio il tuo codice. Si noti che null == undefined è vero. null === undefined è falso. JavaScript è divertente! –

+0

Vedere anche http://stackoverflow.com/questions/801032/why-is-null-an-object-and-whats-the-difference-compared-to-undefined – mrk

risposta

20

tuo global.User è undefined, non null. Quando si utilizza == vengono considerati uguali, ma con === gli elementi che si stanno confrontando devono essere dello stesso tipo. undefined ha il tipo undefined e null ha il tipo object.

undefined e null sono molto simili, ma generalmente indicano due cose molto diverse. Solitamente undefined è il risultato quando a qualcosa non è stato assegnato alcun valore, mentre null ha un valore e il valore è impostato esplicitamente su "niente".

+0

Quindi ... se un oggetto può essere indefinito o nullo a seconda della situazione, è più sicuro usare == anziché ===? – David

+4

@David Generalmente eviterei l'ambiguità e assicurarmi che sia inizializzato su 'null'. Come in ogni situazione, i pochi fattori che è necessario prendere in considerazione, più facile sarà ragionare su un problema. – loganfsmyth

10

L'unico valore che non si eguali in JavaScript è NaN. Se null === null è false, il tuo motore JavaScript ha seri problemi;)

Per assicurarti che l'istruzione condizionale sia scritta correttamente, usa sempre le parentesi graffe.

var x = null; 
if (x !== null) { 
    console.log('x is not equal to null'); 
} 
3

E 'ancora più semplice

var x = null; 
    if (x) 6 
    if (!x) 7 

il risultato è

undefined 
7