Подтвердить что ты не робот

JavaScript: В чем разница между `if (! X)` и `if (x == null)`?

В чем разница между if (!x) и if (x == null); то есть, когда их результаты могут быть разными?

4b9b3361

Ответ 1

!x вернет true для каждого значения "ложь" (пустая строка, 0, null, false, undefined, NaN), тогда как x == null вернет только true if x null (изменить: или, по-видимому, undefined (см. ниже)).

Попробуйте с x = 0, есть разница.

Можно сказать, что оператор NOT ! преобразует значение в его противоположный логический эквивалент. Это отличается от фактического сравнения двух значений.

Кроме того, если вы сравниваете значения с ==, JavaScript делает преобразование типа, что может привести к неожиданному поведению (например, undefined == null), Лучше всегда использовать строгое сравнение === (значение и тип должны быть одинаковыми) и использовать преобразование типов, только если вы действительно знаете, что делаете.

Что-то читать:


Обновление:

Для получения дополнительной информации о нестрогом сравнении null и undefined (или сравнения в целом) стоит взглянуть на Технические. Алгоритм сравнения определен там (сравнение x == y):

  • Если тип (x) совпадает с типом (y), то (...)
  • Если x является null, а y undefined, верните true.
  • Если x undefined, а y null, верните true.
  • (...)

(...)

Ответ 2

Результаты могут быть разными, если x является ложным, NaN, '' (пустая строка), undefined (используя оператор строгого сравнения ===) или 0 (ноль).

Посмотрите ответ Феликса Клинга за отличное резюме сравнения типов.

Ответ 3

Скажите, что x - это строка.

x = undefined;
if(!x) {
   alert("X is not a truthy value");
}
if(x == null) {
   alert("X is null");
}

x = "";
if(!x) {
   alert("X is not a truthy value");
}
if(x == null) {
   alert("X is null");
}

x = null;
if(!x) {
   alert("X is not a truthy value");
}
if(x == null) {
   alert("X is null");
}

Вы заметите, что "X не является правдивым значением" показано во всех трех случаях, но только в случае, когда X является undefined, или null - это "X is null".

Когда X является логическим значением, тогда (!x) будет истинным, если X является ложным, но (x == null) не будет. Для чисел 0 и NaN считаются ложными значениями, поэтому X не является правдивым.

Посмотрите на действие, включая разницу между == (равенство с использованием преобразования типа) и === (строгое равенство)

Ответ 4

if (!x) 

coerces x использует внутреннюю функцию ToBoolean

if (x==null)

коэрцирует оба операнда, используя внутреннюю функцию ToPrimitive (которая, как правило, разрешает каждой стороне число, иногда строку, в зависимости от операндов)

Для полного объяснения ToBoolean vs ToPrimitive см. http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/

Ответ 5

!x проверяет ложное значение. Это будет верно для любого значения, которое может распространяться на false по любой причине. Это будет верно для перестановок false, 0 и т.д. И т.д.

x == null отличается тем, что var x = 0 НЕ будет null... но будет ошибочным.

Ответ 6

В этом вопросе/ответе есть некоторые функции isTrue isFalse, которые могут помочь людям:

прощающий isTrue isFalse