JavaScript comprueba si la variable existe (está definida / inicializada)
Frecuentes
Visto 1,784 equipos
1966
¿Qué método para comprobar 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
or
if (typeof(elem) !== 'undefined') {
or
if (elem != null) {
30 Respuestas
3285
¿Quieres typeof
operador. Específicamente:
if (typeof variable !== 'undefined') {
// the variable is defined
}
respondido 27 nov., 14:14
Parece una buena solución, pero ¿puede explicar por qué funciona? - morgan cheng
En realidad, debe verificar que el objeto sea lo que necesita. Entonces eso sería si (typeof console == 'object') {// variable es lo que necesito que sea} - estático
@George IV: "solo haz` if (variable) "- um, no, eso falla por falso y 0. - Jason S
'if (variable)' también falla para probar la existencia de propiedades de objeto. - Scotts
@ geowa4 En realidad, arrojará un error si la variable no está definida. - kevinji
931
LA typeof
El operador comprobará si la variable es realmente indefinida.
if (typeof variable === 'undefined') {
// variable is undefined
}
LA typeof
operador, a diferencia de los otros operadores, no lanza un Error de referencia excepción cuando se usa con una variable no declarada.
Sin embargo, tenga en cuenta que typeof null
regresará "object"
. Debemos tener cuidado para evitar el error de inicializar una variable para null
. Para estar seguros, esto es lo que podríamos usar en su lugar:
if (typeof variable === 'undefined' || variable === null) {
// variable is undefined or null
}
Para obtener más información sobre el uso de una comparación estricta ===
en lugar de simple igualdad ==
, Consulte:
¿Qué operador de igual (== vs ===) debe usarse en las comparaciones de JavaScript?
contestado el 23 de mayo de 17 a las 13:05
@StevenPenny Consulta la cronología. La respuesta principal se fusionó de otra pregunta después de que se publicó esta respuesta - Rob ♦
Advertencia: esto no funciona para miembros de objetos, si intenta acceder a ellos usando la notación de puntos como en some_object.a_member
. - Zelphir Kaltstahl
esto no verifica si existe una variable, verifica su tipo de valor. Quiere comprobar si se ha declarado una variable. La respuesta de @ BrianKelley es la correcta. - dramentol
porque no solo variable != null
parece captar variables "indefinidas" igualmente bien - equipofusible
271
En muchos casos, usar:
if (elem) { // or !elem
¡hará el trabajo por usted! ... esto verificará estos casos a continuación:
- indefinido: si el valor no está definido y es
undefined
- nulo: si es nulo, por ejemplo, si no existe un elemento DOM ...
- cuerda vacía:
''
- 0: Número cero
- Yaya: no un número
- false
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. ' '
uno, esto se definirá en javascript ya que tiene espacios dentro de la cadena ... por ejemplo, en este caso, agrega una verificación más usando trim (), como:
if(elem) {
if(typeof elem === 'string' && elem.trim()) {
///
Además, estos controles son para valores solo, como los objetos y las matrices funcionan de manera diferente en Javascript, la matriz vacía []
y objeto vacío {}
son siempre verdadero.
Creo la imagen a continuación para mostrar un breve resumen de la respuesta:
Respondido 11 Jul 18, 11:07
@Alireza, ¡qué lindo! Tu respuesta ayudará a mucha gente. Ya memoricé estos valores falsos, lo único de lo que no estaba seguro era sobre []. - Thiago Yoiti
Recibo un "ReferenceError: elem no está definido" - cuerda
@ropo, es porque ni siquiera definiste el elem para verificar cuál es, si es tu caso, debes verificarlo con typeof (elem) === "string" que ya se mencionó ... - Alireza
Entonces la respuesta es engañosa cuando dice if(elem)
comprueba si no está definido (mientras que devuelve un error no definido), ¿no es así? - fanky
Dame un caso de uso para verificar si una variable no está definida y si está definida con un valor indefinido. Algunos de ustedes se están aferrando a las pajitas y tratando de verse brillantes, pero si están configurando un valor como indefinido y verificando ese valor, obviamente devolverá falso o necesitarán cambiar su código, smh ... ¡esta respuesta es correcta! !!! - almcafé
215
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:
if (typeof v === "undefined") {
// no variable "v" is defined in the current scope
// *or* some variable v exists and has been assigned the value undefined
} else {
// some variable (global or local) "v" is defined in the current scope
// *and* it contains a value other than undefined
}
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 preocupan esas cosas):
if ("v" in window) {
// global variable v is defined
} else {
// global variable v is not defined
}
Esto, por supuesto, asume que está ejecutando en un navegador (donde window
es un nombre para el objeto global). Pero si estás jugando con globales como este, probablemente estés en un navegador. Subjetivamente, usando 'name' in window
es estilísticamente consistente con el uso window.name
para referirse a globales. Accediendo a globales como propiedades de window
en lugar de como variables, le permite minimizar el número de variables no declaradas a las que hace referencia en su código (para el beneficio de la interferencia), y evita la posibilidad de que su global sea ensombrecido por una variable local. Además, si los globals hacen que su piel se erice, es posible que se sienta más cómodo tocándolos solo con este palo relativamente largo.
Respondido 22 Oct 12, 16:10
Esto solo verifica si la variable se declaró globalmente. Si está codificando correctamente, entonces está limitando sus vars globales. Informará falso para vars locales: (function () {var sdfsfs = 10; console.log ("sdfsfs" en la ventana);}) () `- Eddie Monge Jr.
Esta es la mejor respuesta f $ # ^% ing. Estaba al final del ingenio tratando de averiguar cómo dar cuenta de exactamente este caso de la esquina. Brillante. No tenía idea de que pudieras hacer esto. - nombre_usuario_temporal
Aviso: su respuesta se ha migrado aquí desde stackoverflow.com/questions/519145/… - shog9
Para usuarios de Angular: Desafortunadamente, no parece estar permitido en una declaración ng-if. - qwertzguy
... modelo perfecto para controles a lo largo del alcance. tiene alguna indicación de rendimiento, si "en la ventana" o "(tipo de variable === 'indefinido' || variable === nulo)". En realidad, estoy interesado en una prueba de hechos concretos y no en una justificación potencial argumentada (que podría hacer yo mismo: la segunda cláusula tiene más operaciones -> peor rendimiento) - Más rápido
122
En la mayoría de los casos, usaría:
elem != null
A diferencia de un simple if (elem)
, Permite 0
, false
, NaN
e ''
, pero rechaza null
or undefined
, lo que la convierte en una buena prueba general de la presencia de un argumento o propiedad de un objeto.
Los otros controles tampoco son incorrectos, solo tienen diferentes usos:
if (elem)
: se puede utilizar sielem
se garantiza que es un objeto, o sifalse
,0
, etc. se consideran valores "predeterminados" (por lo tanto, equivalentes aundefined
ornull
).typeof elem == 'undefined'
se puede utilizar en los casos en que un especificadonull
tiene un significado distinto para una propiedad o variable no inicializada.- Este es el único cheque que no arrojará un error if
elem
no es declaró (es decir, novar
declaración, no una propiedad dewindow
, o no un argumento de función). En mi opinión, esto es bastante peligroso, ya que permite que los errores tipográficos pasen desapercibidos. Para evitar esto, consulte el método siguiente.
- Este es el único cheque que no arrojará un error if
También es útil una comparación estricta con undefined
:
if (elem === undefined) ...
Sin embargo, debido a que el undefined
se puede anular con otro valor, es mejor declarar la variable undefined
en el alcance actual antes de usarlo:
var undefined; // really undefined
if (elem === undefined) ...
o:
(function (undefined) {
if (elem === undefined) ...
})();
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.
respondido 28 mar '11, 04:03
Me sorprende que puedas anular undefined
. Ni siquiera creo que valga la pena mencionarlo en la respuesta. Probablemente el peor nombre de variable aceptable en todo Javascript. - cory danielson
Esto causa una excepción y requiere que use window.
antes de la variable si se usa en el contexto global ... esta no es la mejor manera. - alex w
Debido a este problema primordial, SIEMPRE debe usar void(0)
en lugar de undefined
. - Bartlomiej Zalewski
+1 ya que esta respuesta señala que a veces es posible que quieres identificar false
, 0
, etc. como valores no válidos. - rinogo
89
Comprobar si window
.hasOwnProperty
("varname
")
Una alternativa a la plétora de typeof
respuestas;
Buscar variables declaradas con un var varname = value;
declaración en el ámbito global
se puede acceder como propiedades del objeto de ventana.
Como tal, la hasOwnProperty()
método, que
devuelve un booleano que indica si el objeto tiene la propiedad especificada como su propia propiedad (en lugar de heredarla)
se puede utilizar para determinar si
a var
of "varname" ha sido declarado globalmente es decir, es una propiedad del window
.
// Globally established, therefore, properties of window
var foo = "whatever", // string
bar = false, // bool
baz; // undefined
// window.qux does not exist
console.log( [
window.hasOwnProperty( "foo" ), // true
window.hasOwnProperty( "bar" ), // true
window.hasOwnProperty( "baz" ), // true
window.hasOwnProperty( "qux" ) // false
] );
Lo bueno de esto hasOwnProperty()
es que al llamarlo, no usamos una variable que aún no esté declarada, lo cual, por supuesto, es la mitad del problema en primer lugar.
Aunque no siempre Perfecto or ideal solución, en determinadas circunstancias, ¡es solo el trabajo!
Notas
Lo anterior es cierto cuando se usa var
para definir una variable, Opuesto a let
cual:
declara una variable local de alcance de bloque, inicializándola opcionalmente a un valor.
es diferente al
var
palabra clave, que define una variable globalmente o localmente a una función completa independientemente del alcance del bloque.En el nivel superior de programas y funciones,
let
, diferente avar
, no crea una propiedad en el objeto global.
Por completitud: const
las constantes, por definición, no son realmente variables (aunque su contenido puede serlo); más relevante:
Las constantes globales no se convierten en propiedades del objeto de ventana, a diferencia de
var
variables. Se requiere un inicializador para una constante; es decir, debe especificar su valor en la misma declaración en la que se declara.El valor de una constante no puede cambiar mediante la reasignación y no se puede volver a declarar.
La declaración const crea una referencia de solo lectura a un valor. No significa que el valor que tiene sea inmutable, solo que el identificador de variable no se puede reasignar.
Como let
variables o const
Las constantes nunca son propiedades de ningún objeto que haya heredado la hasOwnProperty()
método, no se puede utilizar para comprobar su existencia.
Respecto a la disponibilidad y uso de hasOwnProperty()
:
Cada objeto descendió de Objeto hereda el
hasOwnProperty()
método. [...] a diferencia delin
operador, este método no comprueba la cadena del prototipo del objeto.
Respondido el 20 de junio de 20 a las 10:06
Esta es una alternativa increíble y debería estar entre los más votados de esta pregunta. Simplifique el título de la respuesta con un ejemplo práctico que devuelva true
(p.ej window.hasOwnProperty('console')
or var hop = "p";window.hasOwnProperty('hop')
). - CPHPython
Finalmente algo que no arroja un error por acceder a un miembro que no existe… Algo que todos los typeof
las respuestas simplemente pasan por alto. - Zelphir Kaltstahl
Esta respuesta está desactualizada: según ECMAScript estándar, puede definir variables con let
donde estas variables no están disponibles como propiedades del window
[o cualquier otro objeto disponible]. hasOwnProperty
pruebas de presencia de propiedades, no variables y, por lo tanto, no se puede utilizar para detectar variables definidas por let
. - amén
@amn La respuesta sigue siendo cierta con respecto al uso de var
y en ese sentido no está desactualizado. Sin embargo, he agregado una nota que describe cómo el uso de let
e const
difiere de la de var
. Gracias por tu inspiración; juntos nos levantamos :) - Fred Gandt
@amn He reescrito la respuesta (con suerte por última vez) para dejar más claro que hasOwnProperty
sólo se puede utilizar de la manera prescrita para comprobar la existencia de var
variables. Me parece bien. - Fred Gandt
71
Cómo comprobar si existe una variable
Esta es una solución bastante a prueba de balas para probar si una variable existe y se ha inicializado:
var setOrNot = typeof variable !== typeof undefined;
Se utiliza con mayor frecuencia en combinación con un operador ternario para establecer un valor predeterminado en caso de que una determinada variable no se haya inicializado:
var dark = typeof darkColor !== typeof undefined ? darkColor : "black";
Problemas con la encapsulación
Desafortunadamente, no puede simplemente encapsular su cheque en una función.
Podría pensar en hacer algo como esto:
function isset(variable) {
return typeof variable !== typeof undefined;
}
Sin embargo, esto producirá un error de referencia si está llamando, por ejemplo. isset(foo)
y variable foo
no se ha definido, porque no puede pasar una variable inexistente a una función:
Error de referencia no detectado: foo no está definido
Prueba de si los parámetros de la función no están definidos
Mientras nuestro isset
La 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:
var a = '5';
var test = function(x, y) {
console.log(isset(x));
console.log(isset(y));
};
test(a);
// OUTPUT :
// ------------
// TRUE
// FALSE
Aunque no tiene valor para y
se transmite a la función test
, nuestra isset
La función funciona perfectamente en este contexto, porque y
es conocido en función test
como una undefined
.
Respondido el 20 de junio de 20 a las 10:06
46
La forma corta de probar una variable no está declarada (no indefinida) es
if (typeof variable === "undefined") {
...
}
Lo encontré útil para detectar secuencias de comandos que se ejecutan fuera de un navegador (sin haber declarado window
variable).
contestado el 10 de mayo de 19 a las 21:05
¿Es esta la "forma canónica" que es portátil? - Jason
Esto está mal. 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 hiciste this.hasOwnProperty('bar')
podría haber funcionado. - oligofreno
este código no funciona y puede verificarlo usando cualquier consola del navegador - ha9u63ar
Imagine const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();
. Variable x
está definido pero se devuelve falso ... - user2878850
41
Hay otra forma abreviada de verificar esto, cuando realiza asignaciones simples y verificaciones relacionadas. Simplemente use Operador condicional (ternario).
var values = typeof variable !== 'undefined' ? variable : '';
También esto será útil cuando intente declarar la variable Global con asignación de instancia de la variable de referencia.
Si quisiera verificar la variable no debería ser undefined
or null
. Luego realice la siguiente verificación.
Cuando se declara la variable, y si desea verificar el valor, esto es incluso simple: y se realizaría undefined
e null
cheques juntos.
var values = variable ? variable : '';
respondido 08 mar '18, 06:03
la respuesta es rotundamente incorrecta. La variable typeof siempre devuelve una cadena, por lo que nunca es falsa. por ejemplo, si typeof(booooo)
is "undefined"
luego typeof(typeof boooooo)
is "string"
e typeof boooooo && true
es siempre true
. La respuesta de @ John-Slegers es lo más abreviada que puede obtener con typeof. - MPAG
Su respuesta absolutamente correcta. Aquí hay un violín que funciona. Y no sé de qué escenario estás hablando. Las preguntas tratan de comprobar la existencia de variables. - RajeshKdev
@mpag No digas nada mal. Pruébalo. Encontrar un error es muy fácil, en cambio, puede proporcionar buenas respuestas aquí. Si la respuesta es completamente incorrecta 28 los programadores no habrían votado a favor sin comprobar mi respuesta. Dado que hay muchas respuestas de renombre aquí, podrían haber votado eso, no esto. - RajeshKdev
En realidad, la segunda parte del código no debe verificar la misma condición que la anterior. Pensé que la gente entendería por esta línea If you wanted to check variable shouldn't be undefined or null.
Con este comentario, se indica claramente que no se debe realizar la verificación de declaración de variable. eso es para verificar el valor de la variable. - RajeshKdev
su segunda verificación fallará con valor 2 - Farid Alnamrouti
35
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
or !== null
solo comprobará si el valor de la variable es exactamente null
.
== null
or != null
comprobará si el valor es undefined
or null
.
if(value)
comprobará si la variable es undefined
, null
, 0
o una cadena vacía.
Respondido 25 Feb 11, 03:02
12
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). Así que simplemente verificando varName !== undefined
tiene el potencial de no regresar siempre como se esperaba, porque otras librerías podrían haber cambiado de forma indefinida. Algunas respuestas (@ skalee's, por ejemplo), parecen preferir no usar typeof
, y eso podría causarle problemas.
La forma "antigua" de manejar esto era declarar indefinido como var para compensar cualquier posible silenciamiento / anulación de undefined
. Sin embargo, la mejor forma sigue siendo utilizar typeof
porque ignorará cualquier anulación de undefined
de 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 ...
Respondido 22 Feb 13, 18:02
El punto es discutible, porque si varName no está definido, entonces varName !== undefined
solo causará un ReferenceError. La mutabilidad de undefined
no importará. - Wutaz
Aviso: su respuesta se ha migrado aquí desde stackoverflow.com/questions/519145/… - shog9
En versiones más recientes de Javascript undefined
es una propiedad de solo lectura. Sin embargo, para ser a prueba de balas, puede usar typeof mvVar === typeof void 0
. void 0
devoluciones undefined
siempre. - kwarnke
11
if (typeof console != "undefined") {
...
}
O mejor
if ((typeof console == "object") && (typeof console.profile == "function")) {
console.profile(f.constructor);
}
Funciona en todos los navegadores.
Respondido el 03 de enero de 13 a las 08:01
¿Por qué este último es mejor en tu opinión? - skalee
@skalee Estoy de acuerdo en que este último es mejor. Esto por la sencilla razón de que comprueba si los tipos son los que desea antes de usarlos. - Broxzier
Aviso: su respuesta se ha migrado aquí desde stackoverflow.com/questions/519145/… - shog9
11
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 use strict
modo)
try{
notDefinedVariable;
} catch(e) {
console.log('detected: variable not exists');
}
console.log('but the code is still executed');
notDefinedVariable; // without try-catch wrapper code stops here
console.log('code execution stops. You will NOT see this message on console');
BONUS: (refiriéndose a otras respuestas) ¿Por qué? ===
es mas claro que ==
(fuente)
si (a == b)
si (a === b)
Respondido el 20 de junio de 20 a las 10:06
Para su información, (a == b) colocado en la cuadrícula de Game of Life no fue tan emocionante. - caracoles
10
Para contribuir al debate, si sé que la variable debe ser una cadena o un objeto, siempre prefiero if (!variable)
, así que comprobando si es falso. Esto puede llevar a un código más limpio para que, por ejemplo:
if (typeof data !== "undefined" && typeof data.url === "undefined") {
var message = 'Error receiving response';
if (typeof data.error !== "undefined") {
message = data.error;
} else if (typeof data.message !== "undefined") {
message = data.message;
}
alert(message);
}
..podría reducirse a:
if (data && !data.url) {
var message = data.error || data.message || 'Error receiving response';
alert(message)
}
Respondido el 14 de diciembre de 17 a las 14:12
Esto no es lo que pidió el OP. Si data.url es igual a ''
su solución lo consideraría indefinido, cuando de hecho se define como que contiene una cadena vacía. - demonio negro
Estoy de acuerdo que no es lo que se ha pedido, y tiene razón: la cadena vacía "" se consideraría indefinida. Pero publiqué esto porque pensé que podría ser útil en el debate que se ha creado entre diferentes respuestas. Y en el ejemplo, así como en muchos otros casos, solo desea imprimir una cadena si realmente hay contenido, por lo que está bien aprovechar el hecho de que javascript considera falsa tanto una cadena vacía como una indefinida. de3
9
Nulo es un valor en JavaScript y typeof null
devoluciones "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:
if ((typeof variable !== "undefined") && (variable !== null))
{
// the variable is defined and not null
}
Respondido el 21 de Septiembre de 15 a las 06:09
8
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 en particular. Indefinido es un valor especial que será el valor predeterminado de las variables no asignadas.
var _undefined;
var _null = null;
alert(_undefined);
alert(_null);
alert(_undefined == _null);
alert(_undefined === _null);
Respondido el 12 de junio de 15 a las 14:06
Sería útil mostrar en línea el resultado de cada alerta. - demisx
@demisx De acuerdo, pero en lugar de sugerir la edición, ¿por qué no hacerlo? La opción está ahí por una razón. Algunos pueden considerarlo de mala educación; Lo considero eficiente, por lo que edité la respuesta yo mismo (pendiente de revisión). - Fred Gandt
@Fred: miré el historial de ediciones y puedo adivinar por qué sus ediciones fueron rechazadas ... en lugar de simplemente agregar líneas para mostrar cuál sería el resultado, como sugirió demisx, cambió significativamente lo que Jith había publicado. - Esteban P.
8
Utilizo dos formas diferentes según el objeto.
if( !variable ){
// variable is either
// 1. '';
// 2. 0;
// 3. undefined;
// 4. null;
// 5. false;
}
A veces no quiero evaluar una cadena vacía como falsey, entonces uso este caso
function invalid( item ){
return (item === undefined || item === null);
}
if( invalid( variable )){
// only here if null or undefined;
}
Si necesita lo contrario, entonces, en primera instancia,! Variable se convierte en !! variable, y en la función no válida === se convierte en! = Y el nombre de la función cambia a notInvalid.
respondido 19 mar '18, 15:03
7
La comprobación más robusta de 'está definido' es con tipo de
if (typeof elem === 'undefined')
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:
elem = elem || defaultElem;
A menudo está bien de usar, consulte: Manera idiomática de establecer el valor predeterminado en javascript
También existe este delineador que usa el tipo de palabra clave:
elem = (typeof elem === 'undefined') ? defaultElem : elem;
contestado el 23 de mayo de 17 a las 12:05
7
se puede utilizar el typeof
operador.
Por ejemplo,
var dataSet;
alert("Variable dataSet is : " + typeof dataSet);
El fragmento de código anterior devolverá el resultado como
variable dataSet es: indefinido.
Respondido el 12 de junio de 15 a las 14:06
Aviso: su respuesta se ha migrado aquí desde stackoverflow.com/questions/519145/… - shog9
7
Para verificar si una variable ha sido declarada / configurada, hice este truco sucio.
No he encontrado una manera de extraer el código a una función, incluso con eval
.
"use strict";
// var someVar;
var declared;
try {
someVar;
declared = true;
} catch(e) {
declared = false;
}
if (declared) {
console.log("someVar is declared; now has the value: " + someVar);
} else {
console.log("someVar is not declared");
}
Respondido 05 Abr '16, 18:04
¿Qué quieres decir con "extraer el código a una función"? - melab
@Melab Idealmente podrías tener function isDefined(x){...}
y luego llamar isDefined(myVar)
. Pero no hay forma de pasar de forma segura una variable potencialmente indefinida a isDefined
porque antes de que la variable pueda pasarse a la función, debe evaluarse, y si aún no existe, en ese momento arrojará (fuera de la try/catch
bloque, que es in la función). Tienes que evaluar la variable directamente dentro de un try/catch
block, por lo que no puede envolver la prueba en una función. - Bolígrafo Ben
6
En la situación particular descrita en la pregunta,
typeof window.console === "undefined"
es idéntico a
window.console === undefined
Prefiero este último porque es más corto.
Tenga en cuenta que buscamos console
sólo en el ámbito global (que es un window
objeto en todos los navegadores). En esta situación particular es deseable. No queremos console
definido en otro lugar.
@BrianKelley en su gran respuesta explica los detalles técnicos. Solo agregué una conclusión ausente y la digerí en algo más fácil de leer.
Respondido 17 Feb 13, 03:02
Aviso: su respuesta se ha migrado aquí desde stackoverflow.com/questions/519145/… - shog9
Falso. el último arroja una excepción en mi consola. - john ktejik
5
Mi preferencia es typeof(elem) != 'undefined' && elem != null
.
Independientemente de lo que elija, considere poner el cheque en una función como esta
function existy (x) {
return typeof (x) != 'undefined' && x != null;
}
Si no sabe que la variable está declarada, continúe con typeof (x) != 'undefined' && x != null;
Donde sepa que la variable está declarada pero puede que no exista, puede usar
existy(elem) && doSomething(elem);
La variable que está comprobando puede ser una propiedad anidada a veces. Puedes usar prop || {} para seguir la línea comprobando la existencia de la propiedad en cuestión:
var exists = ((((existy(myObj).prop1||{}).prop2||{}).prop3||{})[1]||{}).prop4;
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)
Respondido el 13 de diciembre de 15 a las 15:12
Si lo pones en una función, es redundante. typeof (x) != 'undefined' && x != null
es equivalente a x != null
cuando x
se declara. - Ry- ♦
4
Depende de la situación. Si está buscando algo que puede o no haber sido definido globalmente fuera de su código (como jQuery quizás), desea:
if (typeof(jQuery) != "undefined")
(No hay necesidad de una igualdad estricta allí, typeof siempre devuelve una cadena). Pero si tiene argumentos para una función que pueden o no haber sido pasados, siempre estarán definidos, pero nulos si se omiten.
function sayHello(name) {
if (name) return "Hello, " + name;
else return "Hello unknown person";
}
sayHello(); // => "Hello unknown person"
Respondido 25 Feb 11, 04:02
4
Atención: personas que no entienden la diferencia entre un valor. let
, constante const
y variable var
deben abstenerse de comentar.
Estas respuestas (aparte de la solución de Fred Gandt) son todas incorrectas o incompletas.
Supongamos que necesito mi variableName;
llevar un undefined
valor, y por lo tanto ha sido declarado de una manera tal como var variableName;
lo que significa que ya es inicializado; - ¿Cómo verifico si ya está declarado?
O incluso mejor: ¿cómo verifico inmediatamente si "Book1.chapter22.paragraph37" existe con una sola llamada, pero no genera un error de referencia?
Lo hacemos utilizando el operador JasvaScript más poderoso, el in operador.:
"[variable||property]" in [context||root]
>> true||false
En tiempos de máxima popularidad de AJAX, escribí un método (luego llamado) isNS () que es capaz de determinar si el espacio de nombres existe, incluidas pruebas profundas para nombres de propiedades como "Book1.chapter22.paragraph37" y mucho más.
Pero dado que ha sido publicado anteriormente y debido a su gran importancia, merece ser publicado en un hilo aparte, no lo publicaré aquí sino que proporcionaré palabras clave (javascript + esNS ) que le ayudará a localizar el código fuente, respaldado con todas las explicaciones necesarias.
respondido 13 nov., 20:21
3
if (variable === undefined) {}
funciona bien y solo comprueba si no está definido.
Respondido 17 ago 20, 22:08
3
Podría usar un bloque try ... catch como el siguiente:
var status = 'Variable exists'
try {
myVar
} catch (ReferenceError) {
status = 'Variable does not exist'
}
console.log(status)
Una desventaja es que no puede ponerlo en una función, ya que arrojaría un ReferenceError
function variableExists(x) {
var status = true
try {
x
} catch (ReferenceError) {
status = false
}
return status
}
console.log(variableExists(x))
Edit:
Si estaba trabajando en Javascript front-end y necesitaba verificar si una variable no se inicializó (var x = undefined
contará como no inicializado), puede usar:
function globalVariableExists(variable) {
if (window[variable] != undefined) {
return true
}
return false
}
var x = undefined
console.log(globalVariableExists("x"))
console.log(globalVariableExists("y"))
var z = 123
console.log(globalVariableExists("z"))
Editar 2:
Si necesita verificar si existe una variable en el alcance actual, simplemente puede pasar this
a la función, junto con el nombre de la variable contenida en una cadena:
function variableExists(variable, thisObj) {
if (thisObj[variable] !== undefined) {
return true
}
return false
}
class someClass {
constructor(name) {
this.x = 99
this.y = 99
this.z = 99
this.v = 99
console.log(variableExists(name, this))
}
}
new someClass('x')
new someClass('y')
new someClass('z')
new someClass('v')
new someClass('doesNotExist')
Respondido 06 Oct 20, 17:10
1
Me sorprende que esto no se haya mencionado todavía ...
aquí hay un par de variaciones adicionales que usan this['var_name']
La ventaja de utilizar este método es que se puede utilizar antes de definir una variable.
if (this['elem']) {...}; // less safe than the res but works as long as you're note expecting a falsy value
if (this['elem'] !== undefined) {...}; // check if it's been declared
if (this['elem'] !== undefined && elem !== null) {...}; // check if it's not null, you can use just elem for the second part
// these will work even if you have an improper variable definition declared here
elem = null; // <-- no var here!! BAD!
Respondido 25 Abr '19, 19:04
Esto está mal. 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 hiciste this.hasOwnProperty('bar')
podría haber funcionado. - oligofreno
1
In Reaccionar, ¡las cosas son un poco más complicadas! Esto se debe a que es un entorno compilado, que sigue ESLint's no-undef
regla desde react-scripts@2.0.3
(liberado 1 de octubre de 2018). La documentación aquí es útil para cualquier persona interesada en este problema ...
En JavaScript, antes de ES6, las declaraciones de variables y funciones se elevan a la parte superior de un alcance, por lo que es posible usar identificadores antes de sus declaraciones formales en código ...
Esta [nueva] regla [de ES6] advertirá cuando encuentre una referencia a un identificador que aún no ha sido declarado.
Entonces, si bien es posible tener una undefined
(o "no inicializada") variable, es imposible tener una variable no declarada en ReactJS sin desactivar las reglas de eslint.
Esto puede ser muy frustrante: hay tantos proyectos en GitHub que simplemente aprovechan los estándares anteriores a ES6; y compilarlos directamente sin ningún ajuste es básicamente imposible.
Pero, para ReactJS, puedes usar eval()
. Si tiene una variable no declarada como ...
if(undeclaredvar) {...}
Simplemente puede reescribir esta parte como ...
if(eval('typeof undeclaredvar !== "undefined"')) {...}
Por ejemplo ...
if(eval("false")) {
console.log("NO!");
}
if(eval("true")) {
console.log("YEAH!");
}
Para aquellos que importan repositorios de GitHub en un proyecto ReactJS, esta es simplemente la única forma de verificar si una variable está declarada. Antes de cerrar, me gustaría recordarles que hay problemas de seguridad con eval()
si se usa incorrectamente.
Respondido el 09 de Septiembre de 20 a las 03:09
1
Prefiero este método por su precisión y concisión:
var x
if (x === void 0) {
console.log(`x is undefined`)
} else {
console.log(`x is defined`)
}
Como se ha mencionado en otros comentarios y respuestas, undefined
no se garantiza que sea indefinido. Debido a que no es una palabra clave, se puede redefinir como una variable en ámbitos distintos al ámbito global. Aquí hay un pequeño ejemplo que demuestra este matiz:
var undefined = 'bar'
console.log(`In the global scope: ${undefined}`)
function foo() {
var undefined = 'defined'
var x
if (x === undefined) {
console.log(`x === undefined`)
} else {
console.log(`x !== undefined`)
}
if (x === void 0) {
console.log(`x === void 0`)
} else {
console.log(`x !== void 0`)
}
}
foo()
Ver vacío por compatibilidad (compatible con IE5!? !! ¡Guau!).
Respondido 25 Feb 21, 02:02
-1
También puedes usar !!
antes de una variable para comprobar si está definida. P.ej
let dog = "woof";
let chineseCat; // Undefined.
console.log("1.");
console.log(!!dog && !!chineseCat ? "Both are defined" : "Both are NOT defined");
chineseCat= "mao"; // dog and chineseCat are now defined.
console.log("2.");
console.log(!!dog && !!chineseCat ? "Both are defined" : "Both are NOT defined");
Salida:
1.
Both are NOT defined
2.
Both are defined
Respondido 29 Oct 20, 02:10
¿Es esta una construcción de nodo y, de ser así, qué versión ... Estaba buscando exactamente esto y parece que no puedo encontrarlo ... JavaScript: shakesfirst: - dancat
Esto es bastante incorrecto, solo verifica si la variable es veraz, no definida. !!0
es falso a pesar de que 0
se define. - jcarón
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas javascript variables initialization undefined or haz tu propia pregunta.
si quieres saber si
foo
se declara, ya seatypeof foo === 'undefined'
ortypeof foo === typeof undefined
- user719662Las respuestas altamente votadas no funcionan para las variables que se declaran pero tienen el valor
undefined
. La respuesta correcta es esta: stackoverflow.com/a/36432729/772035 - Paul@Paulpro, la versión que usa
hasOwnProperty('bar')
no tiene las mismas deficiencias que los demás, pero requeriría algún ajuste para Node (reemplacewindow
global
). - oligofren@Paulpro De hecho, pero mientras pensaba en eso antes de que respondieras, llegué a la conclusión de que no es realmente un problema práctico. Cuando se trata de variables de ámbito de función o bloque, normalmente es el código de su propiedad o al que tiene acceso de escritura, por lo que tendrá un error de tiempo de ejecución en cualquier caso que se puede corregir. Mientras que el problema habitual con las variables que no se han definido (no existen) normalmente reside en el código fuera de su control, por lo que necesita una forma de detectarlo. Entonces es la solución 80/20. - oligofren