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