Menu

null vs undefined en JavaScript: diferencias y cuándo usar cada uno

Qué diferencia hay realmente entre null y undefined en JavaScript, cómo comprobar cualquiera de los dos y cuál conviene usar en tu propio código.

Dos formas de decir "nada"

La mayoría de los lenguajes tienen un único valor para representar la ausencia de algo. JavaScript tiene dos: null y undefined. Se parecen lo suficiente como para confundir a quien empieza, y se diferencian lo suficiente como para pillar por sorpresa a quien ya lleva rodaje. Entender la diferencia entre null y undefined en JavaScript bien merece diez minutos de tu tiempo.

En pocas palabras:

  • undefined es lo que te devuelve JavaScript cuando algo falta.
  • null es lo que escribes cuando quieres decir "vacío a propósito".
index.js
Output
Click Run to see the output here.

Fíjate en el patrón: cada undefined de arriba aparece porque JavaScript no encontró un valor. El null, en cambio, aparece porque alguien lo escribió a mano.

De dónde sale undefined en JavaScript

El valor undefined aparece en un puñado de situaciones muy concretas, todas variantes de "aquí no hay valor disponible":

index.js
Output
Click Run to see the output here.

En todos estos casos, JavaScript intentó leer un valor y no encontró nada. undefined es la forma que tiene el motor de decir: "busqué, pero ahí no había valor".

puedes asignar undefined a mano (let x = undefined;), pero mejor no lo hagas. Déjalo como la señal de "JavaScript no encontró nada". Cuando la decisión la tomas tú, usa null.

De dónde sale null

null solo aparece cuando alguien lo escribió. Esa es justamente la idea: es una marca intencional.

index.js
Output
Click Run to see the output here.

Las APIs del DOM usan null por todas partes: document.getElementById("missing") devuelve null, no undefined, porque el navegador te está diciendo de forma explícita «busqué y la respuesta es que no hay ningún elemento». Lo mismo pasa con JSON.parse("null"), que te devuelve null — recuerda que JSON no tiene undefined.

La idea clave que conviene tener en la cabeza: undefined es la ausencia por defecto, mientras que null es una ausencia elegida a propósito.

La rareza de typeof null

Y aquí llega el clásico:

index.js
Output
Click Run to see the output here.

Que typeof null devuelva "object" es un bug de 1995 que nunca se pudo corregir sin romper miles de webs que ya estaban en producción, así que ahí se quedó para siempre. null no es un objeto: es un valor primitivo, igual que undefined, los números, las cadenas y los booleanos. Lo que pasa es que typeof miente al respecto.

La consecuencia práctica: typeof no sirve para verificar si algo es null en JavaScript. Mejor tira de comparación directa:

index.js
Output
Click Run to see the output here.

O, como pasa más a menudo, comprobar ambos a la vez. De eso va la siguiente sección.

Cómo comprobar null o undefined en JavaScript: el truco de == null

La mayoría de las veces da igual cuál de los dos valores ausentes tengas: lo que quieres saber es si falta algo antes de usarlo. El chequeo idiomático es usar la igualdad débil con null:

index.js
Output
Click Run to see the output here.

value == null devuelve true exactamente para null y undefined, y false para todo lo demás, incluidos 0, "" y false. Y eso suele ser justo lo que queremos. Es la única situación en la que conviene usar == en vez de ===, y los linters lo saben y lo permiten.

Si prefieres ser explícito, value === null || value === undefined significa exactamente lo mismo y se lee con total claridad.

Operadores para valores nullish: ?? y ?.

Se añadieron dos operadores pensados específicamente para trabajar más cómodamente con null y undefined. Ambos tratan los dos valores por igual y no tocan nada más.

El operador de coalescencia nullish (??) aplica un valor por defecto solo cuando el lado previo es null o undefined:

index.js
Output
Click Run to see the output here.

Al compararlo con ||, verías que este reemplazaría el 0 por 3, ya que 0 es un valor falsy. El ?? es más estricto: solo actúa frente a los dos valores nullish.

El encadenamiento opcional (?.) corta la evaluación de una cadena y devuelve undefined en cuanto se topa con null o undefined:

index.js
Output
Click Run to see the output here.

Los dos operadores existen porque "¿este valor es nullish?" es una pregunta que aparece todo el tiempo. Más adelante en el curso los vemos a fondo.

Los parámetros por defecto solo se activan con undefined

Hay una regla sutil pero importante: los valores por defecto de los parámetros se aplican únicamente cuando el argumento es undefined, nunca cuando es null.

index.js
Output
Click Run to see the output here.

Pasar null se interpreta como "elegí explícitamente no tener valor" y se respeta tal cual. Si también quieres que null dispare el valor por defecto, usa ?? dentro de la función:

index.js
Output
Click Run to see the output here.

Esta distinción hace tropezar a muchísima gente. Los valores por defecto de parámetros se encargan de los argumentos que faltan; el operador ?? se encarga de los argumentos nullish.

JSON y el undefined que nunca llega

JSON tiene null, pero no tiene undefined. De ahí que, al serializar, aparezcan sorpresas silenciosas:

index.js
Output
Click Run to see the output here.

El campo age desapareció por completo: JSON.stringify elimina las propiedades cuyo valor es undefined. En cambio, null sobrevive porque JSON sí lo admite. Pasar un objeto por JSON de ida y vuelta es una forma típica de que las propiedades con undefined se esfumen sin hacer ruido.

Dentro de arrays, undefined se convierte en null:

index.js
Output
Click Run to see the output here.

Si estás diseñando el payload de una API, usa null en vez de undefined para los campos sin valor. null sobrevive al viaje; undefined no.

Cuándo usar null o undefined en JavaScript

Una convención razonable para tu propio código:

  • Deja que undefined signifique "no se proporcionó": argumentos que faltan, variables sin asignar, propiedades ausentes. No asignes undefined a mano.
  • Usa null cuando quieras comunicar de forma explícita que "esto está vacío a propósito": un usuario deslogueado, una opción sin seleccionar, un campo de formulario que se limpió.
  • En las fronteras de tu API, acepta ambos (con == null o ??), pero sé consistente con cuál devuelves tú.

Algunas guías de estilo (incluida la de TypeScript) prescinden de null por completo y usan solo undefined. Es una postura defendible: un único valor es más simple que dos. Define una regla por proyecto y aplícala en todos lados.

Lo que viene: coerción de tipos

null y undefined se comportan de formas muy concretas cuando JavaScript los convierte a números, strings o booleanos. Number(null) da 0, pero Number(undefined) da NaN, y ese tipo de asimetría provoca bugs reales. El siguiente tema es la coerción de tipos, y cuando veas las reglas completas, muchas de las rarezas de JavaScript dejarán de ser un misterio.

Preguntas frecuentes

¿Qué diferencia hay entre null y undefined en JavaScript?

undefined significa que a un valor todavía no se le ha asignado nada: es lo que te devuelve JavaScript cuando accedes a una variable sin inicializar, a un argumento que no se pasó o a una propiedad que no existe. null, en cambio, es un 'aquí no hay valor' explícito que tú asignas a propósito. JavaScript nunca genera null por sí mismo; lo tienes que escribir tú.

¿Cómo compruebo a la vez si algo es null o undefined?

Usa value == null. La igualdad débil considera que null y undefined son iguales entre sí, pero no iguales a ningún otro valor, así que x == null es true exactamente para esos dos casos. Es prácticamente el único sitio donde usar == en vez de === se considera idiomático y seguro.

¿Por qué typeof null devuelve 'object'?

Es un bug que viene de la primerísima versión de JavaScript y que ya no se puede arreglar sin romper media web. typeof null devuelve 'object' aunque null sea un valor primitivo. Si quieres comprobar específicamente null, compáralo de forma directa: value === null.

¿Debería usar null o undefined en mi código?

Deja que undefined signifique 'no se ha proporcionado nada' y reserva null para cuando quieras marcar de forma explícita que 'esto está vacío a propósito'. Muchos proyectos (y la propia guía de estilo de TypeScript) directamente evitan null y trabajan solo con undefined. Lo importante es elegir una convención por proyecto y mantenerla.

Aprende a programar con Coddy

COMENZAR