¿Cómo puedo determinar si una variable es 'indefinida' o 'nula'?


2131

¿Cómo determino si la variable es undefinedo null?

Mi código es el siguiente:

var EmpName = $("div#esd-names div#name").attr('class');
if(EmpName == 'undefined'){
  // DO SOMETHING
};
<div id="esd-names">
  <div id="name"></div>
</div>

Pero si hago esto, el intérprete de JavaScript detiene la ejecución.


Respuestas:


2851

Puede usar las cualidades del operador de igualdad abstracta para hacer esto:

if (variable == null){
    // your code here.
}

Porque null == undefinedes cierto, el código anterior capturará ambos nully undefined.


55
Estoy tratando de probar si el evento es nulo en Firefox y un error bloquea la ejecución: "el evento no está definido"
Entretoize

3
@MichaelFever ¿Cómo no funciona eso? Copie y pegue esto en su consola: const y = undefined; y == null;debería volvertrue
Seraf

2
@ChrisStryczynski En el ejemplo de tu comentario declaraste yconstante, pero comparaste abc(no y). Cuando probé a ytravés console.log(y == null);de Chrome y Firefox, obtuve el trueresultado. Si recibió un error, entonces tal vez trató de usar el operador de asignación en =lugar de la comparación, lo ==que tendría sentido para devolver el error, ya constque no se puede reasignar.
Pshemo

2
ejemplo en vivo de comparaciones relevantes. lgtm.
Ryan Haining

2
@ZaytsevDmitry ¿por qué esperaría una prueba si una variable es nullo undefinedpasar si la variable es igual 0? La pregunta no se trata de probar un valor verdadero, sino de probar explícitamente para nullo undefined.
rodrigo-silveira

1108

La forma estándar de atrapar nully undefinedsimultáneamente es esta:

if (variable == null) {
     // do something 
}

--que es 100% equivalente al más explícito pero menos conciso:

if (variable === undefined || variable === null) {
     // do something 
}

Al escribir JS profesional, se da por sentado que se entiende la igualdad de tipos y el comportamiento de ==vs. ===Por lo tanto, usamos ==y solo comparamos con null.


Editar de nuevo

Los comentarios que sugieren el uso de typeofson simplemente incorrectos. Sí, mi solución anterior causará un error de referencia si la variable no existe. Ésto es una cosa buena. Este ReferenceError es deseable: lo ayudará a encontrar sus errores y corregirlos antes de enviar su código, al igual que los errores del compilador en otros idiomas. Use try/ catchsi está trabajando con entradas sobre las que no tiene control.

No debe tener ninguna referencia a variables no declaradas en su código.


47
Esto provocará un error de referencia y romperá la ejecución si la variable no está definida o no se menciona en absoluto en el código, usar typeof es más seguro.
Mani Gandham

56
Eso es más un punto estilístico. Si la variable no se ha declarado en absoluto , eso es realmente una mala escritura por parte del autor. Debe saber si su variable ha sido declarada o no, eso no debería ser una pregunta. Pero , si por alguna razón ese es el caso, esto debería cambiarse a window.variable en lugar de solo variable , lo que no causará un error de referencia. Tipo de debe ser evitado.
temporary_user_name

66
Sí porque escribiste en !==lugar de !=.
temporary_user_name

99
-OP: La afirmación sobre que esas comparaciones son "100% equivalentes" es SIMPLEMENTE INCORRECTA, como notó en su propio EDIT, el segundo causará un Error de referencia. En cuanto a la afirmación: "No debe tener ninguna referencia a variables no declaradas en su código". ¿DE VERDAD? ¿Has oído hablar de parámetros opcionales? jsfiddle.net/3xnbxfsu
Timothy Kanski

16
Los parámetros opcionales de @TimothyKanski pueden estar indefinidos si no se proporcionan opcionalmente, pero definitivamente son variables declaradas. Se declaran y tienen un valor de undefined, como lo haría cualquier variable declarada pero no inicializada, es decir, var someVar;por lo que su argumento realmente no se sostiene
chiliNUT

228

Combinando las respuestas anteriores, parece que la respuesta más completa sería:

if( typeof variable === 'undefined' || variable === null ){
    // Do stuff
}

Esto debería funcionar para cualquier variable que no esté declarada o declarada y explícitamente establecida como nula o indefinida. La expresión booleana debe evaluarse como falsa para cualquier variable declarada que tenga un valor real no nulo.


2
@Aerovistae Reconozco que typeofes un operador, no una función, por lo que no necesita los paréntesis, pero de todos modos aprecio los paréntesis, simplemente por claridad de lectura.
user664833

1
¿Qué hay de verificar directamente if (variable === undefined) en lugar de usar typeof?
Frozen Crayon

2
@ArjunU que provocará un ReferenceError si la variable no se declara. Si no sabe si se declara o no una variable, use la solución anterior. Si puede garantizar que la variable se declare al menos, puede usarvariable == null
Rogue

3
Esta es una mejor solución porque, como señaló @Rogue, la variable podría no declararse.
Abdul Sadik Yalcin

Corríjame si me equivoco, pero ¿no es el primer condicional un superconjunto del segundo y, por lo tanto, el segundo condicional es superfluo?
Marzo Ho

187
if (variable == null) {
    // Do stuff, will only match null or undefined, this won't match false
}

14
En caso de que alguien piense que esta es otra media respuesta, esto realmente funciona. undefinedevalúa igual a null.
Chuck

3
Error en la consola de Chrome ... Error de referencia: la variable no está definida, por lo que podría funcionar, pero no para mí ...
Eran Medan

48
Solo funciona para variables declaradas, no para variables que pueden o no ser declaradas, lo cual rara vez es el caso. (Debe usar typeof + una comprobación nula para ese caso)

11
Solo descubrí que puedes agregar este comentario: /*jshint eqnull:true */en la parte superior de tu documento o función JS, y JSHint dejará de advertirte sobre tus usos de == null.
Web_Designer

3
@Aerovistae, ¿puede señalarme una referencia que explícitamente indique que ==está rota? El coercitivo if(variable == null)en esta respuesta tiene mucho sentido para mí ...
Ben Aston

94
if (typeof EmpName != 'undefined' && EmpName) {

se evaluará como verdadero si el valor no es:

  • nulo

  • indefinido

  • Yaya

  • cuerda vacía ("")

  • 0 0

  • falso


13
Creo que esta es una técnica peligrosa que se ha extendido como el fuego salvaje. Porque muchas de las variables que se verifican podrían ser booleanas o números. Entonces, si el usuario no comprende completamente las consecuencias, esto no es bueno.
útilBee

Proporcione una referencia de esta especificación de JavaScript
villamejia

1
Esto es lo mismo que if (EmpName). Si ya undefinedserá falso.
Rudy

1
Si la variable no está definida. entonces si (EmpName) arrojará un error
Thamaraiselvam

1
@Thamaraiselvam Creo que Rudy podría haber querido decir esto var EmpName; if (EmpName). Donde la variable se define pero no se le asigna un valor.
hungerstar

28

La attr()función jQuery devuelve una cadena en blanco o el valor real (y nunca nullo undefined). El único momento en que regresa undefinedes cuando su selector no devolvió ningún elemento.

Por lo tanto, es posible que desee probar con una cadena en blanco. Alternativamente, dado que las cadenas en blanco, nulas e indefinidas son falsas, puede hacer esto:

if (!EmpName) { //do something }

1
Chrome 17.0.963.78 m da este error:ReferenceError: EmpName is not defined
Eran Medan

66
@EranMedan Sé que es tarde, pero espero que ayude a las personas que vienen aquí más tarde. La razón por la que obtiene un error es porque no se ha declarado en absoluto. Por lo general, debe pasar EmpName (o alguna otra variable) a una función, o al valor de retorno de otra función y, por lo tanto, declararlo (Ejemplo: "var x;"). Para probar si devuelve una cadena indefinida, nula o en blanco, puede usar la solución anterior.
Dave

Me doy cuenta de que esta es una pregunta fría, pero jQuery volverá undefinedsi el atributo no existe en el elemento (no solo si el selector no tiene elementos coincidentes, según la respuesta). Por ejemplo, un imgsin srcno volvería undefinedpara$('img').attr('src');
codinghands

20

He venido a escribir mi propia función para esto. JavaScript es raro.

Es utilizable en literalmente cualquier cosa. (Tenga en cuenta que esto también verifica si la variable contiene valores utilizables . Pero dado que esta información generalmente también es necesaria, creo que vale la pena publicarla). Por favor considere dejar una nota.

function empty(v) {
    let type = typeof v;
    if (type === 'undefined') {
        return true;
    }
    if (type === 'boolean') {
        return !v;
    }
    if (v === null) {
        return true;
    }
    if (v === undefined) {
        return true;
    }
    if (v instanceof Array) {
        if (v.length < 1) {
            return true;
        }
    } else if (type === 'string') {
        if (v.length < 1) {
            return true;
        }
        if (v === '0') {
            return true;
        }
    } else if (type === 'object') {
        if (Object.keys(v).length < 1) {
            return true;
        }
    } else if (type === 'number') {
        if (v === 0) {
            return true;
        }
    }
    return false;
}

Compatible con TypeScript.


Esta función debería hacer exactamente lo mismo que la empty()función de PHP (verRETURN VALUES )

Considera undefined, null, false, 0, 0.0, "0" {}, []como vacío.

"0.0", NaN, " ", trueSe considera que no está vacía.


2
Me he encontrado con un pequeño problema de comprobación nula. Quiero verificar si un parámetro que se pasa es nulo o un objeto vacío { }. Este es un problema de lenguaje común y tonto, pero lo había olvidado. Todas mis búsquedas muestran respuestas para un valor nulo indefinido o comparaciones de igualdad sueltas (==), pero no una igualdad estricta (===) o equivalente. Y luego, aquí en su respuesta clasificada -1 en la parte inferior de la página (antes de votar) está la respuesta que me eludió. Object.keys( obj ).length < 1o tal vez === 0, suponiendo que nunca será -1. De todos modos, votó a favor de 0, woo. : p

Gracias, he podido colocar esta función y limpiar mucho código. Por qué esta no es una función JS estándar me supera.
Andy

3
Debe cambiar todo de la ==de ===aquí, entonces esto sería una función razonable.
Ben McIntyre

13

Si la variable que desea verificar es global, haga

if (window.yourVarName) {
    // Your code here
}

Esta forma de verificar no arrojará un error incluso si la yourVarNamevariable no existe.

Ejemplo: quiero saber si mi navegador admite API de historial

if (window.history) {
    history.back();
}

Cómo funciona esto:

windowes un objeto que contiene todas las variables globales como sus propiedades, y en JavaScript es legal intentar acceder a una propiedad de objeto no existente. Si historyno existe, entonces window.historyregresa undefined. undefinedes falsey, por lo que el código en un if(undefined){}bloque no se ejecutará.


2
Los lectores deben tener en cuenta que un enfoque como este es idiomático para verificar, desde JavaScript que se ejecuta en un navegador, si se ha declarado una variable global y especialmente si está disponible un global proporcionado por el navegador (como la API de historial). No funcionará para verificar si una variable no global es nullo undefinedno funcionará si su JavaScript se ejecuta fuera de un navegador (es decir, en Node.js). También tratará los globales establecidos en 0, falseo ''lo mismo que aquellos que no están declarados undefinedo null, que generalmente está bien.
Mark Amery

Esto supone que el script se está ejecutando en un navegador. Eso no es un hecho.
GreenAsJade

13

El más corto y fácil:

if(!EmpName ){
 // DO SOMETHING
}

esto evaluará verdadero si EmpName es:

  • nulo
  • indefinido
  • Yaya
  • vacío
  • cuerda ("")
  • 0 0
  • falso

3
El caso de uso aquí es que quiero saber la diferencia entre indefinido y falso. Usaré el cheque en nulo entonces.
gast128

12

Probablemente la forma más corta de hacer esto es:

if(EmpName == null) { /* DO SOMETHING */ };

Aquí está la prueba:

Y aquí hay más detalles sobre ==(fuente aquí )

Ingrese la descripción de la imagen aquí

BONIFICACIÓN : por qué ===es más claro que ==(mira la respuesta agc )

Ingrese la descripción de la imagen aquí


9

Acabo de tener este problema, es decir, verificar si un objeto es nulo.
Simplemente uso esto:

if (object) {
    // Your code
}

Por ejemplo:

if (document.getElementById("enterJob")) {
    document.getElementById("enterJob").className += ' current';
}

3
sería mejor establecer var A = document.getElementById ("enterJob") if (A) A.className + = 'current'; de esta manera, haces el 50% de trabajo para obtener el mismo resultado ... Pero tal vez lo hiciste para espectáculos y luego lo saludo.
Harry Svensson

8

Dado que está utilizando jQuery , puede determinar si una variable no está definida o si su valor es nulo mediante el uso de una sola función.

var s; // undefined
jQuery.isEmptyObject(s); // will return true;

s = null; // defined as null
jQuery.isEmptyObject(s); // will return true;

// usage
if(jQuery.isEmptyObject(s)){
    alert('Either variable: s is undefined or its value is null');
}else{
     alert('variable: s has value ' + s);
}

s = 'something'; // defined with some value
jQuery.isEmptyObject(s); // will return false;

Esto no funcionó para mí. Todavía recibí el error: ReferenceError: s is not definedpara el primer ejemplo.
Mark

6

El elemento de verificación jQuery no es nulo:

var dvElement = $('#dvElement');

if (dvElement.length  > 0) {
    // Do something
}
else{
    // Else do something else
}

5

En JavaScript, según mi conocimiento, podemos verificar una variable indefinida, nula o vacía como se muestra a continuación.

if (variable === undefined){
}

if (variable === null){
}

if (variable === ''){
}

Verifique todas las condiciones:

if(variable === undefined || variable === null || variable === ''){
}

vares una palabra reservada, esto arrojaráSyntaxError
dhilt

5

Simplemente puede usar lo siguiente (sé que hay formas más cortas de hacerlo, pero esto puede hacer que sea más fácil de observar visualmente, al menos para otros que miran el código).

if (x === null || x === undefined) {
 // Add your response code here, etc.
}

4

La forma más fácil de verificar es:

if(!variable) {
  // If the variable is null or undefined then execution of code will enter here.
}

1
Esto ejecutará el código si la variable tiene un valor de false, que es potencialmente indeseable.
byxor

La pregunta es clara "¿Cómo determinar si la variable es 'indefinida' o 'nula'?" y en javascript si una variable tiene un valor nulo o indefinido, su valor es falso.
M. Arnold

1
Lo siento, pero eso es incorrecto. Aquí hay un JSfiddle para demostrarlo.
byxor 01 de

Por su respuesta, undefined, null y algunas otras cosas como la cadena vacía, 0, -0 NaNy falsepasar. !operador coacciona el operando- aquí variable- a Boolean: ecma-international.org/ecma-262/#sec-toboolean
Alireza

Pero revise la pregunta: "Cómo determinar si una variable es indefinida o nula", el! el operando usado con un if siempre volverá a verdadero si la variable es nula o indefinida.
M. Arnold

3

Con la solución a continuación:

const getType = (val) => typeof val === 'undefined' || !val ? null : typeof val;
const isDeepEqual = (a, b) => getType(a) === getType(b);

console.log(isDeepEqual(1, 1)); // true
console.log(isDeepEqual(null, null)); // true
console.log(isDeepEqual([], [])); // true
console.log(isDeepEqual(1, "1")); // false
etc...

Puedo verificar lo siguiente:

  • nulo
  • indefinido
  • Yaya
  • vacío
  • cuerda ("")
  • 0 0
  • falso

Esto no responde a la pregunta, que es "¿cómo atrapo nulo e indefinido?" no "¿cómo capturo cada valor de falsey en JavaScript?"
temporary_user_name

@Aerovistae, pensé que lo hice con console.log (isDeepEqual (null, null)); y console.log (isDeepEqual (undefined, undefined)); ?
Tony Tai Nguyen

2

Para probar si una variable es nula o indefinida, uso el siguiente código.

    if(typeof sVal === 'undefined' || sVal === null || sVal === ''){
      console.log('variable is undefined or null');
    }

Cerca pero no. Pierda el typeofy compárelo undefineddirectamente, no como una cuerda. Esto funciona, pero el operador adicional no tiene ningún efecto sino hacerlo más verbal.
temporary_user_name

En este caso, sí, tienes razón, no necesitamos usar typeof. Pero es una buena práctica usar typeof cuando se trata de variables indefinidas. Una razón para usar typeof es que no arroja un error si la variable no ha sido declarada.
DanKodi

Eso es realmente algo malo. No desea variables no declaradas en su código. Desea que arroje un ReferenceError para que pueda encontrar la variable y declararla. ¡Ciertamente no probarías eso en un lenguaje compilado como C ++! El hecho de que JS lo permita no significa que deba hacerse.
temporary_user_name

1
Su o declaración es al revés. Verificar que algo no esté definido sería el primer paso, no el segundo.
Anthony Rutledge

2

Ejecuto esta prueba en la consola de Chrome. Usando (nulo 0) puede verificar indefinido:

var c;
undefined
if (c === void 0) alert();
// output =  undefined
var c = 1;
// output =  undefined
if (c === void 0) alert();
// output =   undefined
// check c value  c
// output =  1
if (c === void 0) alert();
// output =  undefined
c = undefined;
// output =  undefined
if (c === void 0) alert();
// output =   undefined

2

Miremos esto,

  1.  

    let apple; // Only declare the variable as apple
    alert(apple); // undefined

    En lo anterior, la variable solo se declara como apple. En este caso, si llamamos método alert, se mostrará indefinido.

  2.  

       let apple = null; /* Declare the variable as apple and initialized but the value is null */
       alert(apple); // null

En el segundo muestra nulo, porque la variable de apple valor es nula.

Por lo tanto, puede verificar si un valor es indefinido o nulo.

if(apple !== undefined || apple !== null) {
    // Can use variable without any error
}

1

Mejor manera:

if(typeof variable==='undefined' || variable===null) {

/* do your stuff */
}

66
Esta solución exacta ya fue proporcionada por @jkindwall el 11 de octubre de 2013. stackoverflow.com/a/19323555/2943403 Esta publicación de solo código es completamente inútil porque no agrega ningún valor nuevo a la página. De hecho, está agregando una gran cantidad de páginas y perdiendo el tiempo de los investigadores al leerlo. Por favor, elimine esta respuesta.
mickmackusa

1
(null == undefined)  // true

(null === undefined) // false

Porque === verifica tanto el tipo como el valor. El tipo de ambos es diferente pero el valor es el mismo.


1
var i;

if (i === null || typeof i === 'undefined') {
    console.log(i, 'i is undefined or null')
}
else {
    console.log(i, 'i has some value')
}

3
¿Qué sucede si el usuario ingresa la palabra 'indefinido'?
Chuck

Su pregunta es buena, muestra que la condición es verdadera, por lo que debemos cambiar la opción normal indefinida en tipo de condición. @Chuck
KARTHIKEYAN.A

Esto está mal. typeofnunca cederá undefined, solo la cuerda 'undefined'. Además, i == nullya es cierto si ies undefinedasí, por lo que el segundo booleano sería redundante incluso si funcionara.
temporary_user_name

1
Esta solución (con las condiciones invertidas) ya fue proporcionada por @jkindwall el 11 de octubre de 2013. stackoverflow.com/a/19323555/2943403 Esta publicación de solo código es completamente inútil porque no agrega ningún valor nuevo a la página. De hecho, está agregando una gran cantidad de páginas y perdiendo el tiempo de los investigadores al leerlo. Por favor, elimine esta respuesta.
mickmackusa

1

La foo == nullverificación debe hacer el truco y resolver el caso "indefinido O nulo" de la manera más breve. (Sin considerar el caso "foo no se declara"). Pero las personas que están acostumbradas a tener 3 iguales (como la mejor práctica) podrían no aceptarlo. Solo mira eqeqeq o triple-igual en eslint y tslint ...

El enfoque explícito, cuando estamos verificando si una variable es undefinedo por nullseparado, debe aplicarse en este caso, y mi contribución al tema (¡27 respuestas no negativas por ahora!) Es utilizarla void 0como una forma breve y segura de realizar la verificación paraundefined .

El uso foo === undefinedno es seguro porque indefinido no es una palabra reservada y puede sombrearse ( MDN ). El uso de la typeof === 'undefined'verificación es seguro, pero si no nos vamos a preocupar por un caso no declarado, se puede usar el siguiente enfoque:

if (foo === void 0 || foo === null) { ... }

1

si crea una función para verificarlo:

export function isEmpty (v) {
 if (typeof v === "undefined") {
   return true;
 }
 if (v === null) {
   return true;
 }
 if (typeof v === "object" && Object.keys(v).length === 0) {
   return true;
 }

 if (Array.isArray(v) && v.length === 0) {
   return true;
 }

 if (typeof v === "string" && v.trim().length === 0) {
   return true;
 }

return false;
}

-1

Llamar a typeof null devuelve un valor de "objeto", ya que el valor especial nulo se considera una referencia de objeto vacía. Safari a través de la versión 5 y Chrome a través de la versión 7 tienen una peculiaridad en la que llamar a typeof en una expresión regular devuelve "función", mientras que todos los demás navegadores devuelven "objeto".


-1
var x;
if (x === undefined) {
    alert ("only declared, but not defined.")
};
if (typeof y === "undefined") {
    alert ("not even declared.")
};

Solo puede usar el segundo: ya que verificará tanto la definición como la declaración


-1

Todavía creo que la mejor / segura manera de probar estas dos condiciones es convertir el valor en una cadena:

var EmpName = $("div#esd-names div#name").attr('class');

// Undefined check
if (Object.prototype.toString.call(EmpName) === '[object Undefined]'){
    // Do something with your code
}

// Nullcheck
if (Object.prototype.toString.call(EmpName) === '[object Null]'){
    // Do something with your code
}

¿Puede explicar por qué cree que esta es la "mejor / segura manera" de realizar las pruebas?
sadmicrowave

Debido a que la conversión siempre devuelve una cadena "estandarizada" (es decir, [objeto no definido]), no se mete en problemas al probar valores falsos. Esa es solo mi opinión basada en las experiencias que tuve con los valores de verdad / falsedad.
n1kkou

Gracias por la explicación. No estoy criticando, es una respuesta interesante, solo quería que proporcionara alguna explicación para otros sobre por qué esto es potencialmente superior a otros métodos.
sadmicrowave

¡Sin preocupaciones! Tuve muchos problemas con este tipo de comparaciones, y hasta ahora, lo considero el enfoque más útil para este asunto.
n1kkou

-2

Puede verificar si el valor es indefinido o nulo simplemente usando typeof:

if(typeof value == 'undefined'){

Vea los comentarios en la respuesta anterior ( stackoverflow.com/a/21273362/6305294 ) con respecto a typeof.
Alex

44
Esto es incorrecto. No coge null. No entiendo por qué se proporcionan respuestas nuevas e incorrectas a una pregunta que recibió una respuesta correcta y completa hace muchos años. ¿Sientes que las respuestas actuales son de alguna manera insuficientes?
temporary_user_name

-4

if(x==null)Es una mala idea en JavaScript. Juzgue con "=="- puede causar una coerción de tipo inesperada, y CoffeeScript no puede leerlo, ¡ nunca use "==" o "! =" En el juicio de condición!

if(x)será mejor, pero tenga cuidado con 0 y "" . Será tratado como falso , no el método igual con "!= null"es verdadero .

Ingrese la descripción de la imagen aquí

Ver las mejores prácticas de JavaScript .


3
Esto es completamente incorrecto, y el estudio superficial de cualquier marco o software de nivel profesional lo confirmará en unos instantes. Usar ==para comparar nulles la forma estándar de captura nully undefineden JS. La coerción de tipo con ==no es un riesgo en este contexto específico, y de hecho se está aprovechando para lograr el objetivo de atrapar a ambos nully undefinedsimultáneamente. Dedique más tiempo a trabajar con el idioma antes de elegir ofrecer respuestas incorrectas y engañosas a preguntas que se resolvieron satisfactoriamente hace años.
temporary_user_name

evitar "==". Todo siempre está cambiando, no estoy de acuerdo contigo @Aerovistae
Albert.Qing

3
No estás en desacuerdo conmigo , no estás de acuerdo con todo el establecimiento de JavaScript. Seamos claros.
temporary_user_name
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.