Eu acho que a maneira mais eficiente de testar "valor é nullou 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_variabletenha 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, typeofpode 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 eqnullopçã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éfalseou0ou ...