JavaScript comprueba si la variable existe (está definida / inicializada)

¿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) {

preguntado el 25 de febrero de 11 a las 01:02

si quieres saber si foo se declara, ya sea typeof foo === 'undefined' or typeof foo === typeof undefined -

Las 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 -

@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 (reemplace window global). -

@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. -

30 Respuestas

¿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

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

En muchos casos, usar:

if (elem) { // or !elem

¡hará el trabajo por usted! ... esto verificará estos casos a continuación:

  1. indefinido: si el valor no está definido y es undefined
  2. nulo: si es nulo, por ejemplo, si no existe un elemento DOM ...
  3. cuerda vacía: ''
  4. 0: Número cero
  5. Yaya: no un número
  6. 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:

indefinido, nulo, etc.

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é

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

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 si elem se garantiza que es un objeto, o si false, 0, etc. se consideran valores "predeterminados" (por lo tanto, equivalentes a undefined or null).

  • typeof elem == 'undefined' se puede utilizar en los casos en que un especificado null 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, no var declaración, no una propiedad de window, 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.

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

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 a var, 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 del in 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

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

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

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

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, 0o una cadena vacía.

Respondido 25 Feb 11, 03:02

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

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

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)

Ingrese la descripción de la imagen aquí

si (a === b)

Ingrese la descripción de la imagen aquí

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

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

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

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.

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

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

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

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

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

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- ♦

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

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

if (variable === undefined) {}

funciona bien y solo comprueba si no está definido.

Respondido 17 ago 20, 22:08

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

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

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

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

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 or haz tu propia pregunta.