Javascript: Сравнение с null -! == vs! =

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

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

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

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

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

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

Я знаю, что чего-то не хватает.


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

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

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

Строка консоли печатается даже тогда, когда GLOBAL.User имеет значение null...

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



Обновление 2

Хорошо, поэтому, прочитав комментарии и посмотрев на мой код, я узнал, что! == могут иметь проблемы, если объект undefined, а не null (см. этот пост: Почему нулевой объект и какая разница между нулем и undefined?).

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

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


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

Ответы

Ответ 1

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

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

Ответ 2

Единственное значение, которое не соответствует самому 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