En el ecosisetma de JavaScript moderno, el manejo efciiente de valores nulos es fundamental para evitar errores en tiempo de ejecución. Los operadores ?. y ?? fueron introducidos para simplificar la lógica de validación de datos y la asignación de valores predeterminados.
Encadenamiento opcional (Optional Chaining: ?.)
Este operador permite acceder a propiedades de un objeto profundamente anidado sin necesidad de validar explícitamente cada nivel de la cadena mediante sentencias if o múltiples validaciones booleanas.
Si la referencia que precede al operador es null o undefined, la expresión se detiene inmediatamente y devuelve undefined en lugar de lanzar un error TypeError.
const perfil = {
usuario: {
detalles: { edad: 25 }
}
};
// Acceso seguro: no lanza error si 'contacto' no existe
const telefono = perfil?.usuario?.contacto?.telefono;
// Invocación segura de métodos
const accion = perfil.usuario.actualizar?.();
Operador de coalescencia nula (Nullish Coalescing: ??)
El operador ?? es una herramienta de asignación de valores de respaldo que se activa exclusivamente cuando el operando izquierdo es null o undefined. A diferencia del operador lógico ||, este respeta los valores considerados "falsy" en JavaScript, como el número 0, las cadenas vacías "" o el valor booleano false.
const config = {
intentos: 0,
token: null
};
// Si el valor es 0, ?? lo mantiene. || lo reemplazaría por 5.
const intentos = config.intentos ?? 5; // Resultado: 0
// Si el valor es nulo, ?? lo sustituye.
const token = config.token ?? "token_predeterminado"; // Resultado: "token_predeterminado"
Comparativa con el operador OR (||)
Es común confundir ?? con ||. La diferencia radica en la interpretación de los valores falsy:
valor || "default": Se usa cuando queremos un valor alternativo ante cualquier resultado falso (null,undefined,0,false,NaN,"").valor ?? "default": Se usa cuando solo queremos actuar ante valores "nulos" (nulloundefined), preservando cualquier otro dato válido.
Uso combinado
La combinación de ambos operadores permite crear flujos de datos robustos, extrayendo valores anidados y aplicando configuraciones por defecto en una sola línea:
const empleado = { id: 101 };
// Intenta obtener la oficina; si no existe o es nulo, asigna un valor por defecto
const ubicacion = empleado?.departamento?.oficina ?? "Sede Central";