Creo que la forma más eficiente para la prueba de "valor es null
o undefined
" es
if (some_variable == null){
// some_variable is either null or undefined
}
Así pues, 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
ha sido declarado, de lo contrario será lanzado un ReferenceError. Sin embargo, en muchos casos de uso se puede asumir que esto es seguro:
cheque por argumentos opcionales:
function(foo){
if(foo == null) {...}
verificación de las propiedades de un objeto existente
if(my_obj.foo == null) {...}
Por otro lado typeof
puede tratar con variables globales no declaradas (simplemente devuelve undefined
). Sin embargo, estos casos deberían reducirse al mínimo por buenas razones, como explicó Alsciende.
Nota 2
Esta - incluso más corto - variante es no equivalente:
if (!some_variable) {
// some_variable is either null, undefined, 0, NaN, false, or an empty string
}
así
if (some_variable) {
// we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}
Nota 3
En general, se recomienda utilizar ===
en lugar de ==
. La solución propuesta es una excepción a esta regla. El JSHint syntax checker incluso proporciona la opción eqnull
por este motivo.
Desde el jQuery style guide:
Strict equality checks (===) should be used in favor of ==. The only exception is when checking for undefined and null by way of null.
// Check for both undefined and null values, for some important reason.
undefOrNull == null;
'si (some_variable) {...}' no se ejecuta si es '' some_variable' false' o '0' o ... – kennytm
buen punto;) Pero digamos que sé no puede ser falso o 0 y solo quiero verificar si puedo usarlo en alguna lógica (como una cadena, matriz, etc.) –
Relacionado: http://stackoverflow.com/questions/27509/detecting-an -un-definido-objeto-propiedad-en-javascript –