Con frecuencia utilizamos el siguiente patrón de código en nuestro código JavaScript
if (typeof(some_variable) != 'undefined' && some_variable != null)
{
// Do something with some_variable
}
¿Hay alguna manera menos verbosa de verificar que tenga el mismo efecto?
Según algunos foros y publicaciones que dicen simplemente lo siguiente debería tener el mismo efecto.
if (some_variable)
{
// Do something with some_variable
}
Desafortunadamente, Firebug evalúa una declaración como error en tiempo de ejecución cuando some_variable
no está definida, mientras que la primera está bien para eso. ¿Es esto solo un comportamiento (no deseado) de Firebug o hay realmente alguna diferencia entre esas dos formas?
javascript
null
undefined
Tomás Vana
fuente
fuente
if(some_variable) { ... }
no se ejecutará sisome_variable
esfalse
o0
o ...Respuestas:
Tienes que diferenciar entre casos:
undefined
o no declaradas . Obtendrá un error si accede a una variable no declarada en cualquier contexto que no seatypeof
.Una variable que ha sido declarada pero no inicializada es
undefined
.Propiedades indefinidas , como
someExistingObj.someUndefProperty
. Una propiedad indefinida no produce un error y simplemente devuelveundefined
, que, cuando se convierte en un valor booleano, se evalúa comofalse
. Entonces, si no te importa0
yfalse
, usarif(obj.undefProp)
está bien. Hay un idioma común basado en este hecho:lo que significa "si
obj
tiene la propiedadprop
, asígnelavalue
, de lo contrario asigne el valor predeterminadodefautValue
".Algunas personas consideran que este comportamiento es confuso, argumentan que conduce a errores difíciles de encontrar y recomiendan usar el
in
operador.fuente
undefined
.typeof
devuelve una cadena. Entoncesvar myVar; typeof(myVar)==undefined
vuelvefalse
notrue
.Creo que la forma más eficiente de evaluar el "valor es
null
oundefined
" esEntonces estas dos líneas son equivalentes:
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:
buscar propiedades en un objeto existente
Por otro lado
typeof
puede tratar con variables globales no declaradas (simplemente retornaundefined
). 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:
entonces
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 laeqnull
opción por este motivo.De la guía de estilo jQuery :
fuente
== null
es, en mi opinión, el más eficiente para probar 'nulo o indefinido' (que es el tema de las preguntas). De ninguna manera es poco común (usado 43 veces en jQuery 1.9.1), ya que muy a menudo sabe que la variable fue declarada, o prueba una propiedad de un objeto existente comoif( o.foo == null)
.window.someProperty == null
. Para las variables locales, puede asegurarse fácilmente de que estén declaradas: en lugar de escribir,if (...) {var local = ""}
escribavar local; if (...) { local = ""; }
Marcar nulo con igualdad normal también devolverá verdadero para indefinido.
if (window.variable == null) alert('variable is null or undefined');
fuente
NaN
de la ecuación de diferencia nunca se puede esperar que sea igualEn los nuevos estándares de JavaScript, como ES5 y ES6, solo puede decir
todos devuelven falso, que es similar a la comprobación de Python de variables vacías. Entonces, si quieres escribir lógica condicional alrededor de una variable, solo di
aquí "nulo" o "cadena vacía" o "indefinido" se manejarán de manera eficiente.
fuente
null
yundefined
, otros valores falsos deberían devolver verdadero!0
,NaN
. Esto es para cuando desea capturar la veracidad de un objeto sin mantener una referencia al objeto para que pueda almacenarlo en lugar de algún objeto potencialmente grande. FYI esto también es equivalente a!!value
, que el primero!
niega la veracidad, y el segundo lo niega nuevamente.if (var)
cuál se convertirá en booleano, por lo que básicamente es completamente inútil ...Boolean(undefined)
funciona, intentar eso con una variable indefinida no funciona, y ese es el punto de hacer la verificación de nulo o indefinido. Esto:if (Boolean(undeclareVarName)) { console.log('yes'); } else { console.log('no'); }
arroja un ReferenceError diciendo "ReferenceError: undeclareVarName no está definido"Si intenta hacer referencia a una variable no declarada, se generará un error en todas las implementaciones de JavaScript.
Las propiedades de los objetos no están sujetas a las mismas condiciones. Si no se ha definido una propiedad de objeto, no se generará un error si intenta acceder a ella. Entonces, en esta situación, podría acortar:
a
Con esto en mente, y el hecho de que las variables globales son accesibles como propiedades del objeto global (
window
en el caso de un navegador), puede usar lo siguiente para las variables globales:En ámbitos locales, siempre es útil asegurarse de que las variables se declaren en la parte superior de su bloque de código, esto ahorrará en los usos recurrentes de
typeof
.fuente
if (myObj.some_property != null)
para obtener un comportamiento equivalente.En primer lugar, debes ser muy claro sobre lo que pruebas. JavaScript tiene todo tipo de conversiones implícitas para dispararte, y dos tipos diferentes de comparador de igualdad:
==
y===
.Una función
test(val)
que pruebanull
oundefined
debe tener las siguientes características:Veamos cuáles de las ideas aquí realmente pasan nuestra prueba.
Estos trabajan:
Estos no funcionan:
Creé un Creé entrada jsperf para comparar la corrección y el rendimiento. de estos enfoques. Los resultados no son concluyentes por el momento ya que no ha habido suficientes ejecuciones en diferentes navegadores / plataformas. ¡Tómese un minuto para ejecutar la prueba en su computadora!
En la actualidad, parece que la
val == null
prueba simple ofrece el mejor rendimiento. También es prácticamente el más corto. Se puede negar la pruebaval != null
si desea el complemento.fuente
Este es el único caso en el que se
==
debe utilizar:fuente
val != null
por lo contrario, solo uno=
y dado que por @Yukulele es el ÚNICO que usará==
, sabrá qué hace cuando lo vea.Como no existe una respuesta única completa y correcta, intentaré resumir:
En general, la expresión:
no se puede simplificar, porque
variable
podría no estar declarado, por lo que omitirlotypeof(variable) != "undefined"
daría como resultado ReferenceError. Pero, puede simplificar la expresión según el contexto :Si el
variable
es global , puede simplificarlo para:Si es local , probablemente pueda evitar situaciones en las que esta variable no esté declarada y también simplificar para:
Si es propiedad de un objeto , no tiene que preocuparse por ReferenceError:
fuente
navigator
parte dewindow
? Cuando tenemos una excepciónnavigator is not defined
, ¿podemos usar lawindow.navigator != null
prueba?Simplemente puede verificar si la variable tiene un valor o no. Sentido,
Si no sabe si existe una variable (es decir, si se declaró), debe consultar con el operador typeof. p.ej
fuente
He hecho esto usando este método
guardar la identificación en alguna variable
luego usar si condición
fuente
Este es un ejemplo de una ocasión muy rara en la que se recomienda usar en
==
lugar de===
. La expresiónsomevar == null
devolverá verdadero paraundefined
ynull
, pero falso para todo lo demás (un error si la variable no está declarada).El uso de
!=
invertirá el resultado, como se esperaba.Los editores modernos no advertirán sobre el uso
==
u!=
operador connull
, ya que este es casi siempre el comportamiento deseado.Comparaciones más comunes:
Inténtalo tú mismo:
fuente
Como se menciona en una de las respuestas, puede tener suerte si habla de una variable que tiene un alcance global. Como ya sabrá, las variables que define globalmente tienden a agregarse al objeto de Windows. Puedes aprovechar este hecho, así que digamos que estás accediendo a una variable llamada bleh, solo usa el operador doble invertido (!!)
Esto devolvería un valor falso mientras bleh no se haya declarado Y se le haya asignado un valor.
fuente
Aquí hay otra forma de usar el método Array incluye () :
fuente
lo que sea yyy es indefinido o nulo, devolverá verdadero
si
No
fuente
Abra las herramientas de desarrollador en su navegador y solo pruebe el código que se muestra en la imagen a continuación.
fuente
Para entenderlo, analicemos cuál será el valor devuelto por el motor Javascript al convertir undefined, null y '' (una cadena vacía también). Puede verificar directamente lo mismo en su consola de desarrollador.
Puede ver que todos se están convirtiendo en falso, lo que significa que estos tres suponen 'falta de existencia' por javascript. Por lo tanto, no es necesario que compruebe explícitamente los tres en su código como se muestra a continuación.
También quiero señalar una cosa más.
¿Cuál será el resultado de Boolean (0)?
Por supuesto falso. Esto creará un error en su código cuando 0 es un valor válido en su resultado esperado. Así que asegúrese de verificar esto cuando escriba el código.
fuente
Similar a lo que tienes, podrías hacer algo como
if (some_variable === undefined || some_variable === null) { do stuff }
fuente
Probar nulidad (
if (value == null)
) o no nulidad (if (value != null)
) es menos detallado que probar el estado de definición de una variable.Además, la prueba
if (value)
(oif( obj.property)
) para garantizar la existencia de su variable (o propiedad del objeto) falla si se define con unfalse
valor booleano . Advertencia emptor :)fuente
Ambos valores se pueden distinguir fácilmente utilizando el operador de comparación estricto:
Ejemplo de trabajo en:
http://www.thesstech.com/tryme?filename=nullandundefined
Código de muestra:
fuente
Si el propósito de la instrucción if es verificar
null
oundefined
valores antes de asignar un valor a una variable, puede hacer uso del Operador de fusión nula , finalmente está disponible en JavaScript, aunque el soporte del navegador es limitado. Según los datos de caniuse , solo el 48.34% de los navegadores son compatibles (a partir de abril de 2020).Esto garantizará que la variable se asigne a una cadena vacía (o cualquier otro valor predeterminado) si
some_variable
esnull
oundefined
.Este operador es el más adecuado para su caso de uso, ya que no devuelve el valor predeterminado para otros tipos de valores falsos como
0
y''
.fuente
Debe definir una función de esta forma:
fuente
En ES5 o ES6, si necesita verificarlo varias veces, puede hacerlo:
fuente
Con Ramda, simplemente puede hacer que
R.isNil(yourValue)
Lodash y otras bibliotecas auxiliares tengan la misma función.fuente