2013-04-25 21 views
18

Ok, więc zainstalowałem Linter na moim edytorze Sublime podczas pracy nad aplikacją node.js. Jedna z rzeczy, które złapała powiedziała, że ​​powinienem zawsze używać! == aby porównać obiekt do wartości null (zwykle używam! =).JavaScript: w porównaniu do wartości null -! == vs! =

Więc zmieniłem to ... ale potem zauważyłem, że! == nie działa.

mam ten scenariusz:

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

Kiedy używać == konsola wydrukowane tej linii, mimo że nie było oczywiście prawdą!. Kiedy przełączyłem go z powrotem na! = Zachowywał się normalnie.

Więc moje pytanie jest, dlaczego jest linter każe mi używać! == jeśli nie to, co Ja chcę, żeby ...

wiem, że czegoś brakuje.


UPDATE Ok, więc może być nieco bardziej skomplikowana, niż się początkowo wydawało. W moim prawdziwym kodzie użyłem! == z obiektem GLOBAL node.js.

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

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

konsoli odbitek linii nawet gdy GLOBAL.User jest null ...

Może ten obiekt jest wyjątkowy?



Aktualizacja 2

Ok, więc po przeczytaniu komentarzy i patrząc na mojego kodu, nauczyłem się tego! == może mieć problemy, jeśli obiekt jest raczej nieokreślone niż wartość null (patrz: ten post: Why is null an object and what's the difference between null and undefined?).

Tak, w moim przypadku, moja zmienna globalna może być, w zależności od tego, kiedy ta metoda jest wywoływana, niezdefiniowana, pusta lub pełna danych. Mam zamiar wrócić i zaktualizować mój kod, aby nigdy nie był niezdefiniowany, a następnie! == będzie działać konsekwentnie.

Dzięki za pomoc!


Dzięki David

+2

[pracuje dla mnie.] (Http://jsfiddle.net/zA4Du/) – 0x499602D2

+0

Nie można powtórzyć eksperyment. Mój x === null, gdy wykonuję twój kod. Należy zauważyć, że null == undefined ma wartość true. null === undefined jest fałszywe. JavaScript jest zabawny! –

+0

Zobacz także http://stackoverflow.com/questions/801032/why-is-null-an-object-and-whats-the-difference-compared-to-undefined – mrk

Odpowiedz

20

Twój global.User jest undefined, nie null. Podczas korzystania z == oceniają one jako równe, ale z === porównywane elementy muszą być tego samego typu. undefined ma typ undefined i null ma typ object.

undefined i null są bardzo podobne, ale zazwyczaj oznaczają dwie bardzo różne rzeczy. Zwykle wynikiem jest undefined, gdy coś nie ma przypisanej wartości, podczas gdy null ma wartość, a wartość jest jawnie ustawiona na "nic".

+0

Więc ... jeśli obiekt może być nieokreślony lub pusty, w zależności od sytuacji bezpieczniej jest użyć == zamiast ===? – David

+4

@ David Ogólnie unikałbym niejasności i upewniałem się, że jest on inicjowany na 'null'. Jak w każdej sytuacji, z kilkoma możliwymi czynnikami, które należy wziąć pod uwagę, tym łatwiej będzie uzasadnić temat. – loganfsmyth

10

Jedyną wartością, która nie równa się w JavaScript jest NaN. Jeśli numer null === null to false, oznacza to, że Twój silnik JavaScript ma poważne problemy;)

Aby upewnić się, że instrukcja warunkowa jest dobrze napisana, należy zawsze używać nawiasów klamrowych.

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

To jest jeszcze bardziej prosta

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

wynik jest

undefined 
7 
Powiązane problemy