Cómo verificar una variable no definida en JavaScript

914

Quería verificar si la variable está definida o no. Por ejemplo, lo siguiente arroja un error no definido

alert( x );

¿Cómo puedo detectar este error?

Jineesh
fuente
55
Parece que este es un abuelo: stackoverflow.com/questions/1485840/… stackoverflow.com/questions/2647867/… - grandes abrazos tal vez esto: stackoverflow.com/questions/27509/…
aleatorio
1
Este no es un duplicado del duplicado marcado. La resolución variable y la resolución de la propiedad del objeto son cosas muy diferentes. Un mejor duplicado es cómo verificar si existe una variable en javascript. .
RobG
Su error se debe a que la variable no se ha declarado. La mayoría de las respuestas se centran en la asignación. Vea mi respuesta para más. Además, muchos de ellos afirman incorrectamente que nulo e indefinido son objetos en JavaScript. Son primitivos , no objetos ...
JBallin

Respuestas:

1691

En JavaScript, nulles un objeto. Hay otro valor para las cosas que no existen, undefined. El DOM regresa nullpara casi todos los casos en los que no puede encontrar alguna estructura en el documento, pero en JavaScript undefinedes el valor utilizado.

Segundo, no, no hay un equivalente directo. Si realmente desea verificar específicamente null, haga lo siguiente:

if (yourvar === null) // Does not execute if yourvar is `undefined`

Si desea verificar si existe una variable, eso solo se puede hacer con try/ catch, ya typeofque tratará una variable no declarada y una variable declarada con el valor de undefinedcomo equivalente.

Pero, para verificar si una variable se declara y no es undefined:

if (yourvar !== undefined) // Any scope

Anteriormente, era necesario utilizar el typeofoperador para verificar indefinidamente, porque era posible reasignar undefinedcomo una variable. La vieja forma se veía así:

if (typeof yourvar !== 'undefined') // Any scope

El problema de undefinedser reasignable se solucionó en ECMAScript 5, que se lanzó en 2009. Ahora puede usar ===y !==probar de forma segura undefinedsin usar, typeofya que undefinedha sido de solo lectura durante algún tiempo.

Si desea saber si un miembro existe independientemente pero no le importa cuál es su valor:

if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance

Si quieres saber si una variable es verdadera :

if (yourvar)

Fuente

Natrium
fuente
71
indefinido no es una palabra reservada; usted (o el código de otra persona) puede hacer "undefined = 3" y eso romperá dos de sus pruebas.
Jason S
66
"Si sabes que la variable existe pero no sabes si hay algún valor almacenado en ella" - ¿eh?
Jason S
36
Creo que se refiere a una variable declarada a la que no se le ha asignado. por ejemplo: var foo; // foo existe pero no tiene valor
Wally Lawless
3
Hmmm ... acabo de notar el enlace "fuente": esta publicación completa es una cita directa de una lista de correo, y probablemente debería editarse para que quede más claro, ya que el autor original no está disponible para aclarar.
Jason S
11
"En JavaScript, nulo es un objeto", eso no es realmente cierto, y probablemente, el culpable de este error es el typeofoperador ( typeof null == 'object'). El nullvalor es un valor primitivo , que es el único valor del tipo Nulo .
CMS
347

La única forma de probar realmente si una variable es undefinedhacer lo siguiente. Recuerde, indefinido es un objeto en JavaScript.

if (typeof someVar === 'undefined') {
  // Your variable is undefined
}

Algunas de las otras soluciones en este hilo lo llevarán a creer que una variable no está definida aunque haya sido definida (con un valor de NULL o 0, por ejemplo).

Michael Wales
fuente
18
Debido a que la pregunta NO ESTÁ INDEFINIDA aquí, debería ser typeof someVar! == 'undefined', ¿verdad?
eomeroff
1
Realmente, no creo que sea un objeto indefinido, consulte primero la documentación developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
Nicramus
2
La única prueba que no produce a ReferenceError.
Nostalg.io
2
Este código es correcto, pero creo que decir undefinedque un objeto en JavaScript es información errónea. ¿Esta afirmación se relaciona con su respuesta de todos modos? Es un valor undefinedde tipo undefined, asignado al identificador global nombrado undefined.
SimplGy
1
Esto ahora es incorrecto en términos de ser la única forma. undefinedha sido de solo lectura desde ES5. Usted puede probar de forma segura para el uso indefinido if (x === undefined) {...}o el uso de la taquigrafía como esto: if (x === void 0).
Stephen M Irving
66

Técnicamente, la solución adecuada es (creo):

typeof x === "undefined"

A veces puedes ponerte perezoso y usar

x == null

pero eso permite que tanto una variable indefinida x, como una variable x que contenga nulo, devuelvan verdadero.

Jason S
fuente
1
si escribe var x;y luego typeof x;obtendrá "undefined"como si lo hicieratypeof lakjdflkdsjflsj;
Muhammad Umer
Entonces, ¿no hay forma de verificar variables indefinidas pero declaradas?
Muhammad Umer
1
No lo creo; No estoy seguro de por qué querrías hacerlo.
Jason S
ujndefined no debería estar entre vértices
LowFieldTheory
¿Qué quieres decir con vértices?
Jason S
19

Una versión aún más fácil y más abreviada sería:

if (!x) {
   //Undefined
}

O

if (typeof x !== "undefined") {
    //Do something since x is defined.
}
Dmitri Farkov
fuente
26
la primera pieza de código puede ser incorrecta si x se establece desde una llamada de función. como x = A (); si A no devuelve nada, devolverá "indefinido" por defecto. Hacer a! X sería cierto, lo que sería lógicamente correcto. Sin embargo, si A () devuelve 0, entonces! X debería ser falso como x = 0. Sin embargo, en JS,! 0 también es cierto.
Rajat
el segundo código se puede acortar a: if (! typeof (XX)) {...} else {...}
Alejandro Silva
2
@AlejandroSilva Lo siento por la respuesta tardía. Eso no funcionará ya que typeof devuelve una cadena, por lo que devolverá 'indefinido' para una variable indefinida, que a su vez se evaluará como VERDADERO, lo que conducirá a un falso positivo de una var definida.
Dmitri Farkov
55
Deshágase del primer fragmento, es simplemente malo
Juan Mendes
1
Otros comentarios han señalado que el primer ejemplo es malo, pero no está claro por qué. Entonces, para cualquier codificador nuevo:! X no prueba si x está definido, sino si es verdadero. Las cadenas, el booleano verdadero y los números positivos son todos verdaderos (y podría estar olvidando algunas cosas), pero otros valores potencialmente válidos como 0, booleano falso y una cadena vacía no son verdaderos. El primer ejemplo puede funcionar para casos de uso específicos (por ejemplo, probar una cadena si puede tratar el vacío de la misma manera que indefinido), pero debido a que muchos no lo harán, no debería considerarse la forma predeterminada de verificar.
cfc
16

A menudo he hecho:

function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}
Joe
fuente
99
Considere cambiar "==" a "===". Si llama a doSomething (nulo) también recibirá la alerta. A menos que eso sea lo que quieras.
Jason S
Sí. Tienes que decidir si quieres equivalente o exactamente igual. Cualquiera de los casos podría tener un uso.
Joe
1
simplemente marque así-> if (typeof variableName! == 'undefined') {alert (variableName);}
Muhammad Sadiq
esto es inútil ya que de todos modos no podrá pasar una var indefinida a una función
avalancha1
2
Seguro que puede. Intenta llamar a una función sin argumento.
Joe
3

También puede usar el operador condicional ternario:

var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

//var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

Juan
fuente
¿Y si var a = false;? Debería comprobar eso si en a===undefinedcambio
Iter Ator
1
Pregunta: marque una variable no definida ... Esta es una variable indefinida: var x; hacer lo anterior arrojará un error
Muhammad Umer
"Si a = false, mostrará" no sé 'a' "". Ese es el problema, la pregunta es probar si está definido, no si es cierto. Si a se define como falso, entonces a no está indefinido. Esto devuelve el resultado incorrecto en ese caso. Vea mi comentario en stackoverflow.com/a/858270/2055492 para obtener más detalles sobre por qué este enfoque no funciona.
cfc
no solo !aprobará verdadero para undefined, también prueba verdadero para 0y nully false. Esto es muy incorrecto y debe eliminarse.
Stephen M Irving
2

A menudo uso la forma más simple:

var variable;
if (variable === undefined){
    console.log('Variable is undefined');
} else {
    console.log('Variable is defined');
}

EDITAR:

Sin inicializar la variable, se generará una excepción "Error de referencia no capturado: la variable no está definida ..."

mokiSRB
fuente
2
Uncaught ReferenceError: variable is not defined
Muhammad Umer
@MuhammadUmer, mal! variablese define por var variable;. Y este fragmento se anulará variableen el ámbito local. Puede romper la lógica que espera acceder a un cierre o variable global. Es decir:var variable = 1; function test() { var variable; if (variable === undefined){ console.log('Variable is undefined'); } else { console.log('Variable is defined: ' + variable); } } test(); // Variable is undefined
Евгений Савичев
2

Otra posible "solución" es usar el windowobjeto. Evita el problema de error de referencia en un navegador.

if (window.x) {
    alert('x exists and is truthy');
} else {
    alert('x does not exist, or exists and is falsy');
}
ubershmekel
fuente
Esto no resuelve la pregunta original en absoluto y es totalmente irrelevante. Poster no estaba preguntando cómo evaluar si algo es verdadero o falso, preguntó cómo hacerlo undefined. Esto no hará eso.
Stephen M Irving
2

¡El error te dice que xni siquiera existe! No se ha declarado , lo que es diferente de que se le asigne un valor.

var x; // declaration
x = 2; // assignment

Si declaras x, no obtendrás un error. Recibiría una alerta que dice undefinedporque xexiste / ha sido declarado pero no se le ha asignado un valor.

Para verificar si la variable ha sido declarada, puede usar typeofcualquier otro método para verificar si existe una variable generará el mismo error que obtuvo inicialmente.

if(typeof x  !==  "undefined") {
    alert(x);
}

Esto verifica el tipo de valor almacenado en x. Solo volverá undefinedcuando xno se haya declarado O si se ha declarado y aún no se ha asignado.

JBallin
fuente
undefined ha sido de solo lectura desde ES5 (versión 2009) y ya no necesita el typeofoperador.
Stephen M Irving
2

El voidoperador regresa undefinedpor cualquier argumento / expresión que se le pase. para que pueda probar el resultado (en realidad, algunos minificadores cambian su código de undefineda void 0para guardar un par de caracteres)

Por ejemplo:

void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}
svarog
fuente
¡Ding Ding! Esta es la respuesta correcta. Es una pena que esté todo el camino en la parte inferior. Todos están tan obsesionados con seguir usando typeofy pensar undefinedpuede reasignarse, lo que no ha sido posible durante aproximadamente una década.
Stephen M Irving
Esto también era seguro antes de ES5 porque en ese entonces, incluso si había reasignado undefined, porque Dios solo sabe qué razón, el uso void 0siempre volverá undefinedindependientemente.
Stephen M Irving
1

Podemos comprobar de la undefinedsiguiente manera

var x; 

if (x === undefined) {
    alert("x is undefined");
} else {
     alert("x is defined");
}
Arshid KV
fuente
1

Solo haz algo como a continuación:

function isNotDefined(value) {
  return typeof value === "undefined";
}

y lo llaman así:

isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false
Alireza
fuente
0

La respuesta aceptada es correcta. Solo quería agregar una opción más. También puede usar el try ... catchbloqueo para manejar esta situación. Un ejemplo extraño:

var a;
try {
    a = b + 1;  // throws ReferenceError if b is not defined
} 
catch (e) {
    a = 1;      // apply some default behavior in case of error
}
finally {
    a = a || 0; // normalize the result in any case
}

Tenga en cuenta el catchbloqueo, que es un poco desordenado, ya que crea un alcance a nivel de bloque. Y, por supuesto, el ejemplo está extremadamente simplificado para responder la pregunta, no cubre las mejores prácticas en el manejo de errores;).

Евгений Савичев
fuente
0

Utilizo una pequeña función para verificar que se haya declarado una variable, lo que realmente reduce la cantidad de desorden en mis archivos javascript. Agrego un cheque para el valor para asegurarme de que la variable no solo exista, sino que también se le haya asignado un valor. La segunda condición verifica si la variable también ha sido instanciada, porque si la variable ha sido definida pero no instanciada (vea el ejemplo a continuación), todavía arrojará un error si intenta hacer referencia a su valor en su código.

No instanciado - var my_variable;Instantado -var my_variable = "";

function varExists(el) { 
  if ( typeof el !== "undefined" && typeof el.val() !== "undefined" ) { 
    return true; 
  } else { 
    return false; 
  } 
}

Luego puede usar una declaración condicional para probar que la variable ha sido definida Y instanciada de esta manera ...

if ( varExists(variable_name) ) { // checks that it DOES exist } 

o para probar que no se ha definido y uso instanciado ...

if( !varExists(variable_name) ) { // checks that it DOESN'T exist }
MistyDawn
fuente
1
¿Por qué no devolver su predicado de inmediato? return typeof el !== "undefined" && typeof el.val() !== "undefined"
skubski