Я думаю, что самый эффективный способ проверить, что "значение - это null
или undefined
" - это
if ( some_variable == null ){
// some_variable is either null or undefined
}
Итак, эти две строки эквивалентны:
if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}
Примечание 1
Как упоминалось в вопросе, короткий вариант требует, чтобы было объявлено some_variable
, в противном случае будет выдано ReferenceError. Однако во многих случаях вы можете предположить, что это безопасно:
проверка необязательных аргументов:
function(foo){
if( foo == null ) {...}
проверка свойств существующего объекта
if(my_obj.foo == null) {...}
С другой стороны, typeof
может работать с необъявленными глобальными переменными (просто возвращает undefined
). Тем не менее, по понятным причинам, эти случаи должны быть сведены к минимуму, как объяснил Альсиенде.
Примечание 2
Это - еще короче - вариант не эквивалент:
if ( !some_variable ) {
// some_variable is either null, undefined, 0, NaN, false, or an empty string
}
так
if ( some_variable ) {
// we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}
Примечание 3
Обычно рекомендуется использовать ===
вместо ==
.
Предлагаемое решение является исключением из этого правила. Синтаксическая проверка JSHint даже предоставляет опцию eqnull
по этой причине.
Из руководства по стилю jQuery :
В пользу == следует использовать строгие проверки на равенство (===). Единственный
исключение - при проверке неопределенности и нуля посредством нуля.
// Check for both undefined and null values, for some important reason.
undefOrNull == null;