Eu acho que a maneira mais eficiente de testar "valor é null
ou undefined
" é
if ( some_variable == null ){
// some_variable is either null or undefined
}
Portanto, essas duas linhas são equivalentes:
if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}
Nota 1
Como mencionado na pergunta, a variante curta requer que some_variable
tenha sido declarada; caso contrário, um ReferenceError será lançado. No entanto, em muitos casos de uso, você pode assumir que isso é seguro:
verifique se há argumentos opcionais:
function(foo){
if( foo == null ) {...}
verifique se há propriedades em um objeto existente
if(my_obj.foo == null) {...}
Por outro lado, typeof
pode lidar com variáveis globais não declaradas (simplesmente retorna undefined
). No entanto, esses casos devem ser reduzidos ao mínimo por boas razões, como explicou Alsciende.
Nota 2
Esta variante - ainda mais curta - não é equivalente:
if ( !some_variable ) {
// some_variable is either null, undefined, 0, NaN, false, or an empty string
}
tão
if ( some_variable ) {
// we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}
Nota 3
Em geral, é recomendável usar em ===
vez de ==
. A solução proposta é uma exceção a esta regra. O verificador de sintaxe JSHint ainda fornece a eqnull
opção por esse motivo.
No guia de estilo do jQuery :
Verificações rigorosas de igualdade (===) devem ser usadas em favor de ==. A única exceção é ao verificar indefinido e nulo por meio de nulo.
// Check for both undefined and null values, for some important reason.
undefOrNull == null;
if(some_variable) { ... }
não será executado sesome_variable
éfalse
ou0
ou ...