Cómo comprobar valor null en JavaScript (null vs undefined, mejores prácticas)

En JavaScript, null (valor nulo intencional) y undefined (variable declarada sin asignar) son "falsy" pero distintos. Comprobar correctamente evita bugs.

Operadores y métodos

1. Igualdad estricta (===) — Recomendado para null exacto

let valor = null;
if (valor === null) { /* es null */ }

Solo true para null. False para undefined, 0, "", false, NaN.

2. Igualdad floja (==) — Detecta null Y undefined

if (valor == null) { /* es null O undefined */ }

Útil atajo para "valor no asignado". No usa === (especie de excepción en el lenguaje).

3. Encadenamiento opcional (?.) — Acceso seguro a propiedades

const nombre = usuario?.perfil?.nombre; // undefined si usuario o perfil son null/undefined
const longitud = array?.length;       // undefined si array es null/undefined

4. Operador de fusión nula (??) — Valor por defecto solo para null/undefined

const config = usuario.config ?? configuracionPorDefecto;
// Si usuario.config es null o undefined → usa configuracionPorDefecto
// Si es 0, "", false → USA 0, "", false (no el default)

Diferencia con || (OR lógico): || usa default para cualquier falsy (0, "", false, NaN, null, undefined). ?? solo para null/undefined.

5. Object.is() — Comparación estricta idéntica

Object.is(valor, null) // true solo si valor es null

Patrones comunes

Verificar argumento de función

function saludar(nombre) {
  if (nombre == null) { // null o undefined
    nombre = "Invitado";
  }
  // o moderno:
  const nombreFinal = nombre ?? "Invitado";
  console.log(`Hola, ${nombreFinal}`);
}

Comprobar propiedad en objeto

// Existe y no es null/undefined:
if (obj.prop != null) { ... }

// Existe (incluye valor null/undefined explícito):
if ('prop' in obj) { ... }

// Tiene propiedad propia (no heredada) y no null/undefined:
if (Object.hasOwn(obj, 'prop') && obj.prop != null) { ... }

Arrays: vacío vs null/undefined

const arr = null;
if (Array.isArray(arr) && arr.length > 0) { ... } // Seguro
// O:
if (arr?.length) { ... } // true si length > 0 (0 es falsy)

Resumen: qué usar cuándo

ObjetivoExpresión
Es exactamente nullx === null
Es null o undefinedx == null / x === null || x === undefined
Valor por defecto si null/undefinedx ?? default
Valor por defecto si falsy (0, "", false...)x || default
Acceso seguro propiedad anidadaobj?.prop?.sub
Ejecutar si NO es null/undefinedif (x != null) { ... }

Errores clásicos

  • if (!x) trata 0, "", false, NaN igual que null — solo si eso es lo que quieres.
  • typeof x === 'null' — typeof null === 'object' (bug histórico de JS). No funciona.
  • Confundir null (ausencia intencional) con undefined (no inicializado).