← JavaScript

Fundamentos

¿Cuál es la diferencia entre `null` y `undefined`?

Ver respuesta — intenta responderla en voz alta primero

undefined significa que una variable existe pero no tiene valor asignado (JavaScript lo pone). null es una ausencia de valor que el programador asigna a propósito.

  • undefined: el valor por defecto. Aparece cuando declaras una variable sin darle valor, cuando una función no retorna nada, o cuando accedes a una propiedad que no existe. JavaScript lo asigna automáticamente.
  • null: lo escribes intencionalmente para decir "aquí no hay nada, y es a propósito". Por ejemplo, para limpiar una variable que antes tenía un objeto.

Ambos están "vacíos", pero undefined es un vacío accidental o por defecto, mientras que null es un vacío intencional.

let sinValor;
console.log(sinValor); // undefined (declarada, no asignada)

const obj = {};
console.log(obj.propiedadInexistente); // undefined

function sinRetorno() {}
console.log(sinRetorno()); // undefined

// Asignas null a propósito
let usuario = { nombre: "Mike" };
usuario = null; // "ya no hay usuario, a propósito"
console.log(usuario); // null

// Comparaciones importantes
console.log(null == undefined);  // true  (coerción: son "similares")
console.log(null === undefined); // false (tipos distintos)
console.log(typeof undefined);   // "undefined"
console.log(typeof null);        // "object" (error histórico)
  • Creer que null y undefined son idénticos. Con == parecen iguales, pero con === no lo son, y su significado es distinto.
  • Sorprenderse de que typeof null sea "object". Es un error histórico del lenguaje que se mantiene por compatibilidad hacia atrás.

"JavaScript pone undefined automáticamente cuando una variable no tiene valor, una función no retorna nada, o una propiedad no existe. Yo asigno null a propósito para representar 'no hay valor'. Con == son iguales por la coerción, pero con === no, porque son tipos distintos. Un detalle curioso es que typeof null devuelve 'object', que es un error histórico del lenguaje."

Reto rápido

¿Qué imprime esto?

console.log(null == undefined);
console.log(null === undefined);
console.log(typeof undefined === typeof null);
Ver respuesta

true, false, false. El primero es true por la coerción. El segundo es false porque los tipos difieren. El tercero compara "undefined" con "object", que son distintos.