JavaScript

JavaScript

Tutorial JavaScript: Operadores avanzados

Aprende los operadores avanzados en JavaScript: spread, rest, nullish coalescing y optional chaining para mejorar tu código moderno.

Aprende JavaScript y certifícate

Operadores spread y rest

Los operadores spread y rest son herramientas esenciales en JavaScript que permiten trabajar con arrays y objetos de manera más flexible y concisa. Ambos utilizan la sintaxis de tres puntos (...), pero cumplen funciones diferentes según el contexto en el que se apliquen.

El operador spread (representado por tres puntos ...) permite "desempaquetar" o "expandir" los elementos de un array u objeto. Es como si quitáramos el "contenedor" y solo usáramos lo que hay dentro.

// Combinar arrays
const fruits= ["manzana", "pera"];
const moreFruits= ["naranja", "plátano"];

// Antes de spread (forma antigua)
const allFruits1 = fruits.concat(moreFruits);

// Con spread (forma moderna)
const allFruits2= [...fruits, ...moreFruits];
console.log(allFruits2); // ["manzana", "pera", "naranja", "plátano"]

// Añadir elementos al inicio o final
const fruitsWithStrawberry= [...fruits, "fresa"];
console.log(fruitsWithStrawberry); // ["manzana", "pera", "fresa"]

También es útil al clonar objetos sin alterar los originales:

// Combinar objetos
const datosBasicos = { nombre: "Juan", edad: 25 };
const datosContacto = { email: "juan@ejemplo.com", telefono: "123456789" };

const perfilCompleto = { ...datosBasicos, ...datosContacto };
console.log(perfilCompleto); 
// { nombre: "Juan", edad: 25, email: "juan@ejemplo.com", telefono: "123456789" }

// Crear una copia de un objeto (copia superficial)
const original = { a: 1, b: 2 };
const copia = { ...original };

El operador rest tiene la misma sintaxis que spread (...), pero hace lo contrario: en lugar de expandir, agrupa múltiples elementos en un array. Se usa principalmente en dos contextos:

En parámetros de funciones

// Función que acepta cualquier número de argumentos
function sumar(...numeros) {
  let total = 0;
  for (let numero of numeros) {
    total += numero;
  }
  return total;
}

console.log(sumar(1, 2));         // 3
console.log(sumar(1, 2, 3, 4, 5)); // 15

En destructuración

// Obtener el primer elemento y agrupar el resto
const colores = ["rojo", "verde", "azul", "amarillo", "negro"];
const [primerColor, segundoColor, ...restantes] = colores;

console.log(primerColor);  // "rojo"
console.log(segundoColor); // "verde"
console.log(restantes);    // ["azul", "amarillo", "negro"]

Es fundamental comprender el contexto para distinguir entre ambos operadores. Si los tres puntos aparecen en el lado derecho de una asignación o como argumento de una función, actúan como spread, expandiendo los elementos. Si aparecen en el lado izquierdo durante la asignación o en los parámetros de una función, funcionan como rest, agrupando los elementos restantes.

Estos operadores simplifican tareas comunes y mejoran la legibilidad del código, permitiendo manejar estructuras de datos complejas de forma más elegante y eficiente en JavaScript moderno.

Operadores Nullish coalescing

El operador Nullish coalescing (??) en JavaScript es una herramienta introducida para manejar valores que pueden ser nulos o indefinidos. Este operador proporciona una forma concisa de establecer un valor por defecto cuando una expresión potencialmente es null o undefined.

El operador ?? evalúa el operando de la izquierda y, si este es no nulo ni indefinido, devuelve dicho operando; de lo contrario, devuelve el operando de la derecha. Su sintaxis es similar a la del operador lógico OR (||), pero con un comportamiento clave diferente:

const value = userInput ?? defaultValue;

En este ejemplo, value tomará el valor de userInput si este no es null ni undefined; de lo contrario, asumirá el valor de defaultValue.

La diferencia principal entre ?? y || radica en cómo tratan los valores falsy. El operador OR considera falsy a valores como 0, '' (cadena vacía), false, NaN, null y undefined, y devolverá el operando de la derecha si el de la izquierda es cualquiera de estos. Sin embargo, ?? solo considera null y undefined como valores nulos, permitiendo que 0, '' y false sean válidos:

const numberOfItems = 0;
const items = numberOfItems ?? 10; // items = 0

const userName = '';
const name = userName ?? 'Guest'; // name = ''

En ambos casos, el operador ?? reconoce que 0 y '' son valores significativos y no deben ser reemplazados por el valor por defecto. Esto mejora la precisión al asignar valores, evitando sobrescribir datos legítimos que podrían ser considerados falsy.

Es importante tener en cuenta las reglas de precedencia al utilizar ?? en combinación con otros operadores. Para prevenir errores, se recomienda usar paréntesis cuando sea necesario:

const result = (a ?? b) || c;

Además, a partir de ECMAScript 2020, existe una restricción denominada "Nullish Coalescing forbid mixes", que prohíbe mezclar ?? con operadores lógicos sin usar paréntesis. Por ejemplo, la siguiente expresión generaría un error de sintaxis:

const invalid = a ?? b || c; // Error: No se puede mezclar `??` con `||` sin paréntesis

Para corregirlo, se deben agrupar los operadores correctamente:

const valid = (a ?? b) || c;

El uso del operador Nullish coalescing mejora la legibilidad y eficiencia del código al proporcionar una forma clara de manejar valores nulos o indefinidos sin afectar otros valores falsy. Es especialmente útil en situaciones donde se espera que ciertos valores puedan no estar definidos y se requiere un valor por defecto seguro.

Operadores optional chaining

El operador optional chaining (?.) en JavaScript es una herramienta poderosa que permite acceder de forma segura a las propiedades de objetos anidados sin necesidad de verificar explícitamente cada referencia. Este operador evita errores al intentar acceder a propiedades de objetos que podrían ser null o undefined.

Tradicionalmente, al acceder a propiedades de objetos anidados, era necesario comprobar que cada nivel del objeto existiera para evitar errores de tipo TypeError:

// Un objeto con datos anidados que podrían no existir
const usuario = {
  nombre: "Ana",
  direccion: {
    ciudad: "Madrid"
    // No tiene calle
  }
  // No tiene información de contacto
};

// Sin optional chaining (forma tradicional)
let calle;
if (usuario && usuario.direccion && usuario.direccion.calle) {
  calle = usuario.direccion.calle;
} else {
  calle = "Desconocida";
}

// Con optional chaining
const calle2 = usuario?.direccion?.calle ?? "Desconocida";
console.log(calle2); // "Desconocida"

// Intentando acceder a métodos que podrían no existir
const resultado = usuario?.verificar?.() ?? "No verificado";

Este operador es especialmente útil cuando:

  • Trabajas con datos de APIs externas
  • Accedes a propiedades de objetos que podrían no estar completos
  • Usas estructuras de datos profundamente anidadas

El optional chaining será muy útil cuando aprendamos a trabajar con APIs y a manejar datos externos en módulos posteriores.

Cuándo usar estos operadores avanzados

Estos operadores modernos mejoran significativamente la legibilidad y robustez del código JavaScript, pero es importante usarlos adecuadamente:

  • Usa spread (...): Cuando necesites combinar arrays u objetos, o crear copias sin modificar los originales.
  • Usa rest (...): Cuando necesites funciones con número variable de argumentos o quieras capturar "el resto" de elementos.
  • Usa nullish coalescing (??): Cuando necesites valores por defecto pero quieras respetar valores como 0 o "".
  • Usa optional chaining (?.): Cuando accedas a propiedades anidadas que podrían no existir.
Aprende JavaScript online

Otras lecciones de JavaScript

Accede a todas las lecciones de JavaScript y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Accede GRATIS a JavaScript y certifícate

Ejercicios de programación de JavaScript

Evalúa tus conocimientos de esta lección Operadores avanzados con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.