¿Qué método para verificar si una variable se ha inicializado es mejor / correcto? (Suponiendo que la variable pueda contener cualquier cosa (cadena, int, objeto, función, etc.))
if (elem) { // or !elem
o
if (typeof(elem) !== 'undefined') {
o
if (elem != null) {
javascript
variables
initialization
undefined
Samuel Liew
fuente
fuente
foo
se declara,typeof foo === 'undefined'
o bientypeof foo === typeof undefined
undefined
. La respuesta correcta es esta: stackoverflow.com/a/36432729/772035hasOwnProperty('bar')
no tiene las mismas deficiencias que las otras, pero requeriría algún ajuste para Node (reemplazarwindow
conglobal
).Respuestas:
Tú quieres el
typeof
operador . Específicamente:fuente
El
typeof
operador verificará si la variable está realmente indefinida.El
typeof
operador, a diferencia de los otros operadores, no lanza una excepción ReferenceError cuando se usa con una variable no declarada.Sin embargo, tenga en cuenta que
typeof null
volverá"object"
. Tenemos que tener cuidado para evitar el error de inicializar una variablenull
. Para estar seguros, esto es lo que podríamos usar en su lugar:Para obtener más información sobre el uso de la comparación estricta en
===
lugar de la igualdad simple==
, consulte:¿Qué operador igual (== vs ===) debe usarse en las comparaciones de JavaScript?
fuente
if(! variable_here)
se romperá en muchos casos. Si la variable es 0 o falsa, fallará. Eso no es lo que quieres.typeof foo === "undefined"
es correcto y mejor que la respuesta más votada, pero las notas adicionales solo hacen que esta respuesta sea confusa.En muchos casos, usando:
¡hará el trabajo por usted! ... esto verificará los siguientes casos:
undefined
''
Por lo tanto, cubrirá todos los casos, pero siempre hay casos extraños que también nos gustaría cubrir, por ejemplo, una cadena con espacios, como este
' '
, esto se definirá en JavaScript ya que tiene espacios dentro de la cadena ... por ejemplo, en este caso, agrega un cheque más usando trim (), como:Además, estas comprobaciones son solo para valores , ya que los objetos y las matrices funcionan de manera diferente en Javascript, la matriz
[]
vacía y el objeto vacío{}
siempre son verdaderos .Creo la imagen a continuación para mostrar un breve resumen de la respuesta:
fuente
if(elem)
verificaciones indefinidas (aunque devuelve un error no definido), ¿no?En JavaScript, se puede definir una variable, pero mantener el valor
undefined
, por lo que la respuesta más común no es técnicamente correcta, y en su lugar realiza lo siguiente:Eso puede ser suficiente para sus propósitos. La siguiente prueba tiene una semántica más simple, lo que hace que sea más fácil describir con precisión el comportamiento de su código y comprenderlo usted mismo (si le importan tales cosas):
Esto, por supuesto, supone que se está ejecutando en un navegador (donde
window
es un nombre para el objeto global). Pero si estás jugando con globals como este, probablemente estés en un navegador. Subjetivamente, usar'name' in window
es estilísticamente consistente con usarwindow.name
para referirse a los globales. El acceso a los globales como propiedades de laswindow
variables, en lugar de hacerlo como variables, le permite minimizar el número de variables no declaradas a las que hace referencia en su código (en beneficio de la alineación), y evita la posibilidad de que su variable global sea sombreada por una variable local. Además, si los glóbulos hacen que su piel se erice, es posible que se sienta más cómodo al tocarlos solo con este palo relativamente largo.fuente
En la mayoría de los casos usaría:
A diferencia de un simple
if (elem)
, que permite0
,false
,NaN
y''
, pero rechazanull
oundefined
, lo que es una buena, prueba general para la presencia de un argumento, o la propiedad de un objeto.Las otras verificaciones tampoco son incorrectas, solo tienen diferentes usos:
if (elem)
: Se puede utilizar sielem
se garantiza que sea un objeto, o sifalse
,0
, etc. se consideran valores "por defecto" (por lo tanto equivalente aundefined
onull
).typeof elem == 'undefined'
se puede usar en casos donde un especificadonull
tiene un significado distinto para una variable o propiedad no inicializada.elem
no se declara (es decirvar
, no hay una declaración, no es una propiedadwindow
o no es un argumento de función). Esto es, en mi opinión, bastante peligroso ya que permite que los errores tipográficos pasen desapercibidos. Para evitar esto, vea el siguiente método.También es útil una comparación estricta contra
undefined
:Sin embargo, debido a que el global
undefined
se puede anular con otro valor, es mejor declarar la variableundefined
en el alcance actual antes de usarlo:O:
Una ventaja secundaria de este método es que los minificadores JS pueden reducir la
undefined
variable a un solo carácter, ahorrándole unos pocos bytes cada vez.fuente
undefined
. Ni siquiera creo que valga la pena mencionarlo en la respuesta. Probablemente el peor nombre de variable aceptable en todo Javascript.window.
antes de la variable si se usa en el contexto global ... esta no es la mejor manera.void(0)
lugar deundefined
.false
,0
, etc., como valores no válidos.Comprueba si
window
.hasOwnProperty
( "varname
" )Una alternativa a la gran cantidad de
typeof
respuestas;Variables globales declaradas con una
var varname = value;
declaración en el alcance globalComo tal, el
hasOwnProperty()
método, quea
var
de "varname" ha sido declarado globalmente, es decir, es una propiedad dewindow
.Lo bueno de esto
hasOwnProperty()
es que al llamarlo, no usamos una variable que aún no esté declarada, lo que, por supuesto, es la mitad del problema en primer lugar.Aunque no siempre es la solución perfecta o ideal , en ciertas circunstancias, ¡es solo el trabajo!
Notas
Lo anterior es cierto cuando se usa
var
para definir una variable , en oposición a lalet
cual:Para completar: las
const
constantes, por definición, no son realmente variables (aunque su contenido puede serlo); más relevante:Dado que las
let
variables oconst
constantes nunca son propiedades de ningún objeto que haya heredado elhasOwnProperty()
método, no se puede usar para verificar su existencia.En cuanto a la disponibilidad y uso de
hasOwnProperty()
:fuente
true
(por ejemplo,window.hasOwnProperty('console')
ovar hop = "p";window.hasOwnProperty('hop')
).typeof
respuestas simplemente pasan por alto.let
que estas variables no están disponibles como propiedades del objetowindow
[o cualquier otro disponible].hasOwnProperty
prueba la presencia de propiedades , no variables y, por lo tanto, no puede utilizarse para detectar variables definidas porlet
.var
y, en ese sentido, no está desactualizada. Sin embargo, he agregado una nota que describe cómo el uso delet
yconst
difiere del devar
. Gracias por tu inspiracion; juntos nos levantamos :)hasOwnProperty
solo se puede usar de la manera prescrita para verificar la existencia devar
variables. Se lee bien para mí.Cómo verificar si existe una variable
Esta es una solución bastante a prueba de balas para probar si existe una variable y se ha inicializado:
Se usa más comúnmente en combinación con un operador ternario para establecer un valor predeterminado en caso de que una determinada variable no se haya inicializado:
Problemas con la encapsulación
Desafortunadamente, no puede simplemente encapsular su cheque en una función.
Puede pensar en hacer algo como esto:
Sin embargo, esto producirá un error de referencia si está llamando, por ejemplo.
isset(foo)
y la variablefoo
no se ha definido, porque no puede pasar una variable no existente a una función:Prueba de si los parámetros de la función no están definidos
Si bien nuestra
isset
función no se puede usar para probar si una variable existe o no (por las razones explicadas anteriormente), nos permite probar si los parámetros de una función no están definidos:Aunque no
y
se transfiere ningún valor a la funcióntest
, nuestraisset
función funciona perfectamente en este contexto, porquey
se conoce en la funcióntest
como unundefined
valor.fuente
Hay otra forma abreviada de verificar esto, cuando realiza tareas simples y verificaciones relacionadas. Simplemente use el operador condicional (ternario).
Esto también será útil cuando intente declarar la variable Global con asignación de instancia de la variable de referencia.
Si desea verificar la variable no debe ser
undefined
onull
. Luego realice la verificación a continuación.Cuando se declara la variable, y si desea verificar el valor, esto es incluso Simple: y se realizaría
undefined
ynull
verificaría en conjunto.fuente
typeof(booooo)
es"undefined"
entoncestypeof(typeof boooooo)
es"string"
ytypeof boooooo && true
es siempretrue
. La respuesta de @ John-Slegers es tan abreviada como se puede obtener con typeof.If you wanted to check variable shouldn't be undefined or null.
, por este comentario, está indicando claramente, no realizar la verificación de declaración de variables. eso es para verificar el valor variable.La forma corta de probar una variable no se declara (no está indefinida) es
Lo encontré útil para detectar secuencias de comandos que se ejecutan fuera de un navegador (sin haber declarado la
window
variable).fuente
window.bar=undefined
se define y se establece en un valor. Su respuesta no detecta la diferencia entre esto y si la variable no existe. Si lo hicierasthis.hasOwnProperty('bar')
, podría haber funcionado.const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();
. La variablex
se define pero se devuelve falso ...Depende si solo le importa que la variable se haya definido o si desea que tenga un valor significativo.
Al verificar si el tipo no está definido, se verificará si la variable ya se ha definido.
=== null
o!== null
solo verificará si el valor de la variable es exactamentenull
.== null
o!= null
comprobará si el valor esundefined
onull
.if(value)
comprobará si la variable esundefined
,null
,0
, o una cadena vacía.fuente
La respuesta más alta es correcta, use typeof.
Sin embargo, lo que quería señalar era que en JavaScript
undefined
es mutable (por alguna razón impía). Por lo tanto, simplemente hacer una verificación devarName !== undefined
tiene el potencial de no siempre regresar como lo espera, porque otras bibliotecas podrían haber cambiado indefinidamente. Algunas respuestas (@ skalee, por ejemplo), parecen preferir no usartypeof
, y eso podría en problemas.La forma "antigua" de manejar esto era declarar indefinido como var para compensar cualquier posible silenciamiento / anulación
undefined
. Sin embargo, la mejor manera es usarlotypeof
porque ignorará cualquier anulación deundefined
otro código. Especialmente si está escribiendo código para usar en la naturaleza donde quién sabe qué más podría estar ejecutándose en la página ...fuente
varName !== undefined
, solo causará un ReferenceError. La mutabilidad deundefined
no importará.undefined
es una propiedad de solo lectura. Sin embargo, para ser a prueba de balas, puede usartypeof mvVar === typeof void 0
.void 0
vuelveundefined
siempre.O mejor
Funciona en todos los navegadores.
fuente
Para contribuir al debate, si sé que la variable debe ser una cadena o un objeto que siempre prefiero
if (!variable)
, compruebe si es falsa. Esto puede llevar a un código más limpio para que, por ejemplo:.. podría reducirse a:
fuente
''
su solución, lo consideraría indefinido, cuando de hecho se define como que contiene una cadena vacía.Es difícil distinguir entre indefinido y nulo. Nulo es un valor que puede asignar a una variable cuando desea indicar que la variable no tiene un valor particular. Indefinido es un valor especial que será el valor predeterminado de las variables no asignadas.
fuente
Nulo es un valor en JavaScript y
typeof null
devuelve"object"
Por lo tanto, la respuesta aceptada no funcionará si pasa valores nulos. Si pasa valores nulos, debe agregar una verificación adicional para los valores nulos:
fuente
La verificación más robusta "está definido" es con typeof
Si solo está buscando una variable definida para asignar un valor predeterminado, para una línea fácil de leer, a menudo puede hacer esto:
A menudo está bien usar, ver: forma idiomática de establecer el valor predeterminado en javascript
También existe este forro con la palabra clave typeof :
fuente
puedes usar el
typeof
operador.Por ejemplo,
El fragmento de código anterior devolverá la salida como
fuente
Para verificar si una variable ha sido declarada / establecida, hice este truco sucio.
No he encontrado una manera de extraer el código a una función, incluso con
eval
.fuente
Estas respuestas (aparte de la solución de Fred Gandt) son incorrectas o están incompletas.
Supongamos que necesito
variableName;
que lleve unundefined
valor y, por lo tanto, se ha declarado de una manera talvar variableName;
que significa que ya está inicializado ; - ¿Cómo verifico si ya está declarado?O incluso mejor: ¿cómo verifico de inmediato si "Book1.chapter22.paragraph37" existe con una sola llamada, pero no surge un error de referencia?
Lo hacemos utilizando el operador JasvaScript más poderoso, el operador in .:
En tiempos de máxima popularidad de AJAX, he escrito un método (más tarde llamado) isNS () que es capaz de determinar si el espacio de nombres existe, incluyendo pruebas profundas para nombres de propiedades como "Book1.chapter22.paragraph37" y mucho más.
Pero dado que se ha publicado anteriormente y, debido a su gran importancia, merece ser publicado en un hilo separado, no lo publicaré aquí, pero proporcionaré palabras clave ( javascript + isNS ) que lo ayudarán a localizar el código fuente, respaldado con todos los explicaciones necesarias
fuente
in
operador solo prueba la existencia de propiedades, y no todas las variables son propiedades,const
y laslet
declaraciones no lo son (yconst
ni siquiera son, bueno, variables ).const
ylet
se estandarizaron con ECMAScript 2015, que se publicó hace más de 3 años y desde entonces ha sido visto por los sospechosos habituales, y hoy en día se usa de manera bastante generalizada, me atrevo a decir: hay más de 2 millones de casos de "const" en Github en archivos JS .in
operador para probar si una variable existe, porque "const y let no son [propiedades]", mientrasconst
que se puede decir que introduce una referencia constante , como opuesto a una referencia de variablelet
, por otro lado, en realidad introduce una referencia de variable ; en otras palabras, es, por cualquier medida, una variable y su respuesta es incorrecta al implicar que puede probar silet
existe una variable definida con utilizando elin
operador, no puedes.window
objeto, no sé cómo aclararlo.let
palabra clave. Eso es todo lo que estaba señalando.En la situación particular descrita en la pregunta,
es idéntico a
Prefiero el último ya que es más corto.
Tenga en cuenta que solo buscamos
console
en el ámbito global (que es unwindow
objeto en todos los navegadores). En esta situación particular es deseable. No queremosconsole
definirse en otra parte.@BrianKelley en su gran respuesta explica los detalles técnicos. Solo he agregado falta de conclusión y lo digerí en algo más fácil de leer.
fuente
Yo uso dos formas diferentes dependiendo del objeto.
A veces no quiero evaluar una cadena vacía como falsey, entonces uso este caso
Si necesita lo contrario, en primera instancia, ¡variable se convierte en variable, y en la función no válida === se convierte! = Y los nombres de las funciones cambian a notInvalid.
fuente
Mi preferencia es
typeof(elem) != 'undefined' && elem != null
.Sin importar cómo elija, considere poner el cheque en una función como esta
Si no sabe que la variable está declarada, continúe con
typeof (x) != 'undefined' && x != null;
Cuando sepa que la variable está declarada pero puede no existir, puede usar
La variable que está comprobando puede ser una propiedad anidada a veces. Puedes usar prop || {} para ir más abajo comprobando la existencia de la propiedad en cuestión:
Después de cada propiedad use (... '|| {}'). NextProp para que una propiedad faltante no arroje un error.
O podrías usar existy como
existy(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q)
fuente
typeof (x) != 'undefined' && x != null
es equivalente ax != null
cuandox
se declara.Depende de la situación. Si está buscando algo que puede o no haberse definido globalmente fuera de su código (tal vez jQuery quizás) desea:
(No hay necesidad de igualdad estricta allí, typeof siempre devuelve una cadena). Pero si tiene argumentos para una función que puede o no haberse pasado, siempre se definirán, pero serán nulos si se omiten.
fuente
Trata de atraparlo
Si la variable no se definió en absoluto, puede verificar esto sin la ejecución del código de interrupción usando el bloque try-catch de la siguiente manera (no necesita
use strict
modo)Mostrar fragmento de código
BONIFICACIÓN: (refiriéndose a otras respuestas) ¿Por qué
===
es más claro que==
( fuente )si (a == b)
si (a === b)
fuente
Me sorprende que esto no haya sido mencionado todavía ...
Aquí hay un par de variaciones adicionales usando
this['var_name']
El beneficio de usar este método es que puede usarse antes de definir una variable.
fuente
window.bar=undefined
se define y se establece en un valor. Su respuesta no detecta la diferencia entre esto y si la variable no existe. Si lo hicierasthis.hasOwnProperty('bar')
, podría haber funcionado.Podrías usar un try ... catch block como el siguiente:
Mostrar fragmento de código
Una desventaja es que no puede ponerlo en una función, ya que arrojaría un ReferenceError
fuente