2013-04-25 2 views
18

Итак, я установил Linter на свой редактор Sublime, работая над моим приложением node.js. Одна из вещей, которые он поймал, сказал, что я всегда должен использовать! == сравнить объект с нулем (я обычно использую! =).Javascript: Сравнение с null -! == vs! =

Так что я изменил его ... но потом я заметил, что! == не работает.

У меня есть такой сценарий:

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

Когда я использую == консоль печататься эту строку, даже если это было явно не так!. Когда я переключил его обратно на! = Он вел себя нормально.

Так что мой вопрос, почему ЛИНТЕР говорит мне использовать! ==, если он не делает то, что я хочу, чтобы ...

Я знаю, что я что-то отсутствует.


UPDATE Ok, так что это может быть немного сложнее, чем я думал. В моем реальном коде я использовал! == с объектом node.js GLOBAL.

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

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

на консоль принтов линии, даже когда GLOBAL.User является нулевым ...

Возможно, этот объект является особенным?



Update 2

Итак, после прочтения через комментарии и глядя на мой код, я узнал, что! == могут возникнуть проблемы, если объект не определен, а не нулевой (см. этот пост: Why is null an object and what's the difference between null and undefined?).

В моем случае моя глобальная переменная может быть в зависимости от того, когда этот метод вызывается, неопределенного, нулевого или полного данных. Я собираюсь вернуться и обновить свой код, чтобы он никогда не был неопределенным, а затем! == будет работать последовательно.

Спасибо за помощь!


Спасибо, Дэвид

+2

[Работы для меня.] (Http://jsfiddle.net/zA4Du/) – 0x499602D2

+0

Невозможно повторить свой эксперимент. Мой x === null, когда я делаю ваш код. Обратите внимание, что null == undefined - true. null === undefined is false. JavaScript - это весело! –

+0

См. Также http://stackoverflow.com/questions/801032/why-is-null-an-object-and-whats-the-difference-compared-to-undefined – mrk

ответ

20

Ваш global.User является undefined, не null. При использовании == они оцениваются равными, но с === элементы, которые вы сравниваете, должны быть одного типа. undefined имеет тип undefined и null имеет тип object.

undefined и null очень похожи, но они обычно означают две совершенно разные вещи. Обычно undefined является результатом, когда что-то не присвоило ему никакого значения, тогда как null имеет значение, а значение явно установлено на «ничего».

+0

Итак ... если объект может быть либо неопределенным, либо нулевым, в зависимости от ситуации безопаснее использовать ==, а не ===? – David

+4

@David Вообще-то я избегаю двусмысленности и удостоверяюсь, что она инициализирована 'null'. Как и в любой ситуации, несколько возможных факторов, которые необходимо учитывать, тем легче будет объяснять проблему. – loganfsmyth

10

Единственное значение, которое не равно себе в JavaScript является NaN. Если null === null - false, то у вашего механизма JavaScript есть серьезные проблемы;)

Чтобы убедиться, что ваш условный оператор хорошо написан, всегда используйте брекеты.

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

Это еще более простой

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

результат

undefined 
7