Я думаю, что самый эффективный способ проверить на «значение есть 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;
if(some_variable) { ... }
не выполнится, еслиsome_variable
естьfalse
или0
или ...