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

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.

Sarfraz
fuente
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.

nombre_usuario_temporal
fuente
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.

jkindwall
fuente
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
}
knocte
fuente
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

Thamaraiselvam
fuente
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 }
Chetan Sastry
fuente
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.

phil294
fuente
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á.

DenisS
fuente
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
userPlus
fuente
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í

Kamil Kiełczewski
fuente
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';
}
Galés
fuente
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;
Angelin Nadar
fuente
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
}
Kapil
fuente
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 === ''){
}
DevAelius
fuente
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.
}
agc
fuente
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.
}
M. Arnold
fuente
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
Tony Tai Nguyen
fuente
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');
    }
DanKodi
fuente
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
suhail
fuente
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
}
Anjana Kumari
fuente
1

Mejor manera:

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

/* do your stuff */
}
Nishanth Matha
fuente
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.

Franklin Pious
fuente
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')
}
KARTHIKEYAN.A
fuente
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) { ... }
dhilt
fuente
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;
}
Ernesto
fuente
-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".

Jones Agyemang
fuente
-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

keshav
fuente
-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
}
n1kkou
fuente
¿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'){
Gedeón
fuente
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 .

Albert.Qing
fuente
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