Creo que la forma más eficiente de evaluar el "valor es null
o undefined
" es
if ( some_variable == null ){
// some_variable is either null or undefined
}
Entonces estas dos líneas son equivalentes:
if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}
Nota 1
Como se menciona en la pregunta, la variante corta requiere que some_variable
se haya declarado; de lo contrario, se lanzará un ReferenceError. Sin embargo, en muchos casos de uso, puede suponer que esto es seguro:
verificar argumentos opcionales:
function(foo){
if( foo == null ) {...}
buscar propiedades en un objeto existente
if(my_obj.foo == null) {...}
Por otro lado typeof
puede tratar con variables globales no declaradas (simplemente retorna undefined
). Sin embargo, estos casos deberían reducirse al mínimo por buenas razones, como explicó Alsciende.
Nota 2
Esta variante, incluso más corta, no es equivalente:
if ( !some_variable ) {
// some_variable is either null, undefined, 0, NaN, false, or an empty string
}
entonces
if ( some_variable ) {
// we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}
Nota 3
En general se recomienda usar en ===
lugar de ==
. La solución propuesta es una excepción a esta regla. El verificador de sintaxis JSHint incluso proporciona la eqnull
opción por este motivo.
De la guía de estilo jQuery :
Se deben usar verificaciones estrictas de igualdad (===) a favor de ==. La única excepción es cuando se comprueba si hay valores indefinidos y nulos a modo de nulo.
// Check for both undefined and null values, for some important reason.
undefOrNull == null;
if(some_variable) { ... }
no se ejecutará sisome_variable
esfalse
o0
o ...