JavaScript

JavaScript

Tutorial JavaScript: Operadores avanzados

JavaScript: Aprende a usar los operadores Spread, Rest, Nullish Coalescing y Optional Chaining. Mejora la eficiencia y claridad de tu código hoy mismo.

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 (...) se utiliza para expandir elementos de un iterable (como un array o un objeto) en lugares donde se esperan cero o más argumentos o elementos. Por ejemplo, al combinar dos arrays:

const numbers = [1, 2, 3];
const moreNumbers = [4, 5, 6];
const combined = [...numbers, ...moreNumbers]; // [1, 2, 3, 4, 5, 6]

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

const original = { a: 1, b: 2 };
const clone = { ...original }; // { a: 1, b: 2 }

El operador rest (...), por el contrario, se utiliza para agrupar el resto de elementos no especificados en una colección. Es frecuente en la definición de funciones con un número variable de argumentos:

function sum(...values) {
  return values.reduce((total, value) => total + value, 0);
}

sum(1, 2, 3); // 6

En este caso, **values** es un array que contiene todos los argumentos proporcionados a la función.

Además, el operador rest es útil en la destructuración de arrays y objetos para capturar elementos restantes:

const [first, ...others] = [10, 20, 30, 40];
console.log(first); // 10
console.log(others); // [20, 30, 40]

En objetos:

const { name, ...details } = { name: 'Alice', age: 25, city: 'Madrid' };
console.log(name); // 'Alice'
console.log(details); // { age: 25, city: 'Madrid' }

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:

if (user && user.address && user.address.street) {
  console.log(user.address.street);
}

Con el operador **?.**, este código se simplifica significativamente:

console.log(user?.address?.street);

En este ejemplo, si **user** o **user.address** son null o undefined, la expresión devuelve undefined en lugar de lanzar un error. Esto mejora la seguridad y la legibilidad del código al reducir la necesidad de múltiples comprobaciones.

El operador optional chaining se puede utilizar en diversas situaciones:

  • Acceso a propiedades:
   const streetName = user?.address?.street;

Aquí, **streetName** será undefined si **user** o **user.address** no están definidos.

  • Invocación de métodos:
   const result = user?.getProfile?.();

Si **user** o **user.getProfile** son null o undefined, **result** será undefined sin provocar un error al intentar invocar un método inexistente.

  • Acceso a elementos de arrays:
   const firstItem = dataArray?.[0];

Si **dataArray** es null o undefined, **firstItem** será undefined en lugar de causar un error.

Es importante destacar que el operador **?.** detiene la evaluación en el punto donde encuentra un valor null o undefined, evitando ejecutar el resto de la expresión. Esto es especialmente útil en estructuras de datos complejas donde algunas propiedades pueden no existir.

Además, el optional chaining se puede combinar con el operador Nullish coalescing (??) para proporcionar valores por defecto:

const username = user?.info?.username ?? 'Guest';

En este caso, **username** tomará el valor de **user.info.username** si existe; de lo contrario, será 'Guest'.

Sin embargo, es crucial usar el operador optional chaining de manera responsable. Un uso excesivo puede ocultar errores lógicos al silenciar silenciosamente referencias a propiedades que no deberían ser null o undefined. Es recomendable utilizarlo cuando existe incertidumbre legítima sobre la existencia de ciertos valores, pero no como sustituto para un manejo adecuado de errores o validaciones.

También es importante tener en cuenta que el optional chaining solo se detiene en el punto exacto donde encuentra un null o undefined, lo que significa que las partes restantes de la expresión no se evalúan. Por ejemplo:

user.admin?.sendMessage(message);

Si **user.admin** es null o undefined, la función **sendMessage** no se invocará, y la expresión devolverá undefined. Esto previene errores al intentar llamar a métodos de objetos no existentes.

En resumen, el operador optional chaining mejora la eficiencia y la claridad del código al permitir acceder a propiedades y métodos de objetos de manera segura y concisa, manejando automáticamente situaciones donde las referencias pueden no estar definidas.

CONSTRUYE TU CARRERA EN IA Y PROGRAMACIÓN SOFTWARE

Accede a +1000 lecciones y cursos con certificado. Mejora tu portfolio con certificados de superación para tu CV.

Plan mensual

19.00 € /mes

Precio normal mensual: 19 €
47 % DE DESCUENTO

Plan anual

10.00 € /mes

Ahorras 108 € al año
Precio normal anual: 120 €
Aprende JavaScript online

Ejercicios de esta lección Operadores avanzados

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.

Array

JavaScript
Puzzle

Modificación de elementos DOM

JavaScript
Proyecto

Encapsulación

JavaScript
Puzzle

Manipulación DOM

JavaScript
Proyecto

Clases y objetos

JavaScript
Código

Uso de operadores

JavaScript
Puzzle

Uso de operadores

JavaScript
Test

Estructuras de control

JavaScript
Test

Funciones

JavaScript
Código

Excepciones

JavaScript
Test

Transformación con map()

JavaScript
Código

Arrays y Métodos

JavaScript
Código

Transformación con map()

JavaScript
Puzzle

Funciones flecha

JavaScript
Test

Async / Await

JavaScript
Código

Polimorfismo

JavaScript
Código

Variables

JavaScript
Código

Selección de elementos DOM

JavaScript
Puzzle

API Fetch

JavaScript
Código

Encapsulación

JavaScript
Test

Mapas con Map

JavaScript
Código

Creación y uso de variables

JavaScript
Puzzle

Polimorfismo

JavaScript
Puzzle

Tipos de datos

JavaScript
Puzzle

Promises

JavaScript
Código

Estructuras de control

JavaScript
Puzzle

Pruebas unitarias

JavaScript
Proyecto

Encapsulación

JavaScript
Código

Inmutabilidad y programación funcional pura

JavaScript
Código

Destructuring de objetos y arrays

JavaScript
Código

Mapas con Map

JavaScript
Código

Funciones flecha

JavaScript
Puzzle

Polimorfismo

JavaScript
Test

Herencia

JavaScript
Código

Array

JavaScript
Código

Transformación con map()

JavaScript
Test

Gestor de tareas con JavaScript

JavaScript
Proyecto

Manipulación DOM

JavaScript
Test

Funciones

JavaScript
Test

Operadores avanzados

JavaScript
Código

Conjuntos con Set

JavaScript
Código

Funciones flecha

JavaScript
Código

Async / Await

JavaScript
Código

Clases y objetos

JavaScript
Código

Métodos de Strings

JavaScript
Código

Creación y uso de variables

JavaScript
Test

Excepciones

JavaScript
Puzzle

Promises

JavaScript
Código

Funciones cierre (closure)

JavaScript
Test

Funciones cierre (closure)

JavaScript
Código

Herencia

JavaScript
Puzzle

Prototipos y cadena de prototipos

JavaScript
Código

Herencia

JavaScript
Test

Estructuras de control

JavaScript
Código

Selección de elementos DOM

JavaScript
Test

Modificación de elementos DOM

JavaScript
Test

Funciones flecha

JavaScript
Código

Filtrado con filter() y find()

JavaScript
Test

Funciones cierre (closure)

JavaScript
Puzzle

Callbacks

JavaScript
Código

Funciones

JavaScript
Puzzle

Mapas con Map

JavaScript
Test

Reducción con reduce()

JavaScript
Test

Callbacks

JavaScript
Puzzle

Manipulación DOM

JavaScript
Puzzle

Introducción al DOM

JavaScript
Proyecto

Expresiones regulares

JavaScript
Código

Promises

JavaScript
Test

Async / Await

JavaScript
Test

Eventos del DOM

JavaScript
Puzzle

Introducción a JavaScript

JavaScript
Puzzle

Async / Await

JavaScript
Puzzle

Excepciones

JavaScript
Código

Promises

JavaScript
Puzzle

Selección de elementos DOM

JavaScript
Proyecto

Filtrado con filter() y find()

JavaScript
Código

Callbacks

JavaScript
Test

Eventos del DOM

JavaScript
Proyecto

Creación de clases y objetos Restaurante

JavaScript
Código

Reducción con reduce()

JavaScript
Código

Filtrado con filter() y find()

JavaScript
Puzzle

Reducción con reduce()

JavaScript
Puzzle

Conjuntos con Set

JavaScript
Puzzle

Herencia de clases

JavaScript
Código

Eventos del DOM

JavaScript
Test

Clases y objetos

JavaScript
Puzzle

Modificación de elementos DOM

JavaScript
Puzzle

Mapas con Map

JavaScript
Puzzle

Proyecto carrito compra agoodshop

JavaScript
Proyecto

Introducción a JavaScript

JavaScript
Test

Filtrado con filter() y find()

JavaScript
Código

Estructuras de control

JavaScript
Código

Funciones

JavaScript
Código

Reducción con reduce()

JavaScript
Código

Proyecto administrador de contactos

JavaScript
Proyecto

Tipos de datos

JavaScript
Test

Clases y objetos

JavaScript
Test

Array

JavaScript
Test

Conjuntos con Set

JavaScript
Test

Todas las 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.

Introducción A Javascript

JavaScript

Introducción Y Entorno

Introducción A Javascript

JavaScript

Introducción Y Entorno

Introducción A Javascript

JavaScript

Introducción Y Entorno

Tipos De Datos

JavaScript

Sintaxis

Variables

JavaScript

Sintaxis

Operadores

JavaScript

Sintaxis

Estructuras De Control

JavaScript

Sintaxis

Funciones

JavaScript

Sintaxis

Funciones Cierre (Closure)

JavaScript

Sintaxis

Métodos De Strings

JavaScript

Sintaxis

Funciones Cierre (Closure)

JavaScript

Sintaxis

Operadores Avanzados

JavaScript

Sintaxis

Funciones

JavaScript

Sintaxis

Expresiones Regulares

JavaScript

Sintaxis

Estructuras De Control

JavaScript

Sintaxis

Variables

JavaScript

Sintaxis

Arrays Y Métodos

JavaScript

Estructuras De Datos

Conjuntos Con Set

JavaScript

Estructuras De Datos

Mapas Con Map

JavaScript

Estructuras De Datos

Conjuntos Con Set

JavaScript

Estructuras De Datos

Funciones Flecha

JavaScript

Programación Funcional

Filtrado Con Filter() Y Find()

JavaScript

Programación Funcional

Transformación Con Map()

JavaScript

Programación Funcional

Reducción Con Reduce()

JavaScript

Programación Funcional

Funciones Flecha

JavaScript

Programación Funcional

Reducción Con Reduce()

JavaScript

Programación Funcional

Filtrado Con Filter() Y Find()

JavaScript

Programación Funcional

Transformación Con Map()

JavaScript

Programación Funcional

Inmutabilidad Y Programación Funcional Pura

JavaScript

Programación Funcional

Clases Y Objetos

JavaScript

Programación Orientada A Objetos

Excepciones

JavaScript

Programación Orientada A Objetos

Encapsulación

JavaScript

Programación Orientada A Objetos

Herencia

JavaScript

Programación Orientada A Objetos

Polimorfismo

JavaScript

Programación Orientada A Objetos

Excepciones

JavaScript

Programación Orientada A Objetos

Encapsulación

JavaScript

Programación Orientada A Objetos

Polimorfismo

JavaScript

Programación Orientada A Objetos

Herencia

JavaScript

Programación Orientada A Objetos

This Y Contexto

JavaScript

Programación Orientada A Objetos

Patrón De Módulos Y Namespace

JavaScript

Programación Orientada A Objetos

Clases Y Objetos

JavaScript

Programación Orientada A Objetos

Excepciones

JavaScript

Programación Orientada A Objetos

Prototipos Y Cadena De Prototipos

JavaScript

Programación Orientada A Objetos

Destructuring De Objetos Y Arrays

JavaScript

Programación Orientada A Objetos

Manipulación Dom

JavaScript

Dom

Selección De Elementos Dom

JavaScript

Dom

Modificación De Elementos Dom

JavaScript

Dom

Eventos Del Dom

JavaScript

Dom

Modificación De Elementos Dom

JavaScript

Dom

Eventos Del Dom

JavaScript

Dom

Localstorage Y Sessionstorage

JavaScript

Dom

Bom (Browser Object Model)

JavaScript

Dom

Modificación De Elementos Dom

JavaScript

Dom

Selección De Elementos Dom

JavaScript

Dom

Callbacks

JavaScript

Programación Asíncrona

Promises

JavaScript

Programación Asíncrona

Async / Await

JavaScript

Programación Asíncrona

Promises

JavaScript

Programación Asíncrona

Async / Await

JavaScript

Programación Asíncrona

Naturaleza De Js Y Event Loop

JavaScript

Programación Asíncrona

Callbacks

JavaScript

Programación Asíncrona

Websockets

JavaScript

Programación Asíncrona

Módulos En Es6

JavaScript

Construcción

Configuración De Bundlers Como Vite

JavaScript

Construcción

Eslint Y Calidad De Código

JavaScript

Construcción

Npm Y Dependencias

JavaScript

Construcción

Introducción A Pruebas En Js

JavaScript

Testing

Pruebas Unitarias

JavaScript

Testing

Accede GRATIS a JavaScript y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  1. Comprender la sintaxis y uso del operador spread.
  2. Saber aplicar el operador rest en funciones y objetos.
  3. Identificar cuándo usar el operador nullish coalescing para valores por defecto.
  4. Utilizar el operador optional chaining para acceder de manera segura a propiedades anidadas.
  5. Diferenciar contextos apropiados para spread y rest.
  6. Asegurar la eficiencia y legibilidad del código con estos operadores.