В чем разница между if (!x)
и if (x == null)
; то есть, когда их результаты могут быть разными?
JavaScript: В чем разница между `if (! X)` и `if (x == null)`?
Ответ 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, которые могут помочь людям: