Spread y rest: copiar, fusionar y agrupar datos sin mutaciones peligrosas

Domina los operadores spread (`...`) y rest para trabajar con arrays/objetos de forma inmutable, construir funciones flexibles y evitar bugs por referencia compartida.

El operador `...` parece pequeño, pero cambia cómo diseñas estado y datos en frontend moderno.

Con spread puedes copiar y combinar estructuras sin tocar el original; con rest puedes agrupar argumentos sin perder claridad en la firma de funciones.

Esta lección evita uno de los bugs más comunes al empezar: mutar arrays/objetos por accidente y romper otras partes de la app.

Objetivo real: saber cuándo usar spread/rest, cuándo no, y cómo depurar referencias compartidas.

  • Spread/rest te ayudan a crear nuevas estructuras en vez de modificar las existentes.
  • En interfaces reactivas, mutar estado original suele producir comportamientos difíciles de rastrear. Crear copias controladas mejora previsibilidad.
  • La regla de oro: si un dato se comparte entre varias partes del sistema, evita mutarlo directamente.
  • Patrón central para formularios, carritos, filtros y estado de UI.
  • Con spread puedes añadir, quitar o reordenar elementos creando una nueva referencia. Esto evita efectos colaterales sobre la lista original.

Idea clave: inmutabilidad práctica, no teoría vacía

Spread/rest te ayudan a crear nuevas estructuras en vez de modificar las existentes.

En interfaces reactivas, mutar estado original suele producir comportamientos difíciles de rastrear. Crear copias controladas mejora previsibilidad.

La regla de oro: si un dato se comparte entre varias partes del sistema, evita mutarlo directamente.

Spread en arrays: combinar y actualizar listas

Patrón central para formularios, carritos, filtros y estado de UI.

Con spread puedes añadir, quitar o reordenar elementos creando una nueva referencia. Esto evita efectos colaterales sobre la lista original.

En estado de frontend, este enfoque facilita detectar cambios y renderizar correctamente.

  • `[...lista, item]` añade al final.
  • `[item, ...lista]` añade al inicio.
  • Combinar: `[...listaA, ...listaB]`.

Spread en objetos: actualizaciones parciales limpias

Ideal para actualizar una propiedad conservando el resto.

`{ ...obj, campo: nuevoValor }` crea un objeto nuevo con todas las propiedades previas y sobreescribe las indicadas al final.

Ojo con objetos anidados: spread hace copia superficial. Si necesitas copia profunda, hay que aplicar estrategia adicional.

Rest en funciones: APIs flexibles de argumentos

Cuando no sabes cuántos valores llegarán, `...args` es tu aliado.

Rest agrupa argumentos en un array real, lo que te permite iterar, validar y calcular sin depender del objeto `arguments` antiguo.

Coloca rest al final de la firma: solo puede haber un rest parameter y debe ser el último.

Errores de referencia compartida y cómo detectarlos

Si dos variables cambian a la vez, probablemente comparten referencia.

Asignar `const b = a` no copia arrays/objetos, solo copia la referencia. Por eso modificar `b` afecta `a`.

Para depurar, compara por identidad (`===`) y registra antes/después de cada operación.

JavaScript
17

Spread y rest: copiar, fusionar y agrupar datos sin mutaciones peligrosas

Domina los operadores spread (`...`) y rest para trabajar con arrays/objetos de forma inmutable, construir funciones flexibles y evitar bugs por referencia compartida.

Código del tema: ...array · ...objeto · (...args)

📘 Teoría

Idea clave: inmutabilidad práctica, no teoría vacía

Spread/rest te ayudan a crear nuevas estructuras en vez de modificar las existentes.

En interfaces reactivas, mutar estado original suele producir comportamientos difíciles de rastrear. Crear copias controladas mejora previsibilidad.

La regla de oro: si un dato se comparte entre varias partes del sistema, evita mutarlo directamente.

1

Spread en arrays

Copiar/fusionar listas sin tocar fuente.

  • const nuevo = [...original]
  • const total = [...a, ...b]
2

Spread en objetos

Crear objetos nuevos con overrides claros.

  • const copy = { ...obj }
  • const actualizado = { ...obj, activo: true }
3

Rest en funciones

Agrupar argumentos variables.

  • function sumar(...nums) {}
  • Flexible para utilidades
4

Rest en destructuring

Separar una parte y conservar el resto.

  • const { id, ...resto } = user
  • const [primero, ...resto] = lista

Spread en arrays: combinar y actualizar listas

Patrón central para formularios, carritos, filtros y estado de UI.

Con spread puedes añadir, quitar o reordenar elementos creando una nueva referencia. Esto evita efectos colaterales sobre la lista original.

En estado de frontend, este enfoque facilita detectar cambios y renderizar correctamente.

  • `[...lista, item]` añade al final.
  • `[item, ...lista]` añade al inicio.
  • Combinar: `[...listaA, ...listaB]`.

Spread en objetos: actualizaciones parciales limpias

Ideal para actualizar una propiedad conservando el resto.

1

`{ ...obj, campo: nuevoValor }` crea un objeto nuevo con todas las propiedades previas y sobreescribe las indicadas al final.

2

Ojo con objetos anidados: spread hace copia superficial. Si necesitas copia profunda, hay que aplicar estrategia adicional.

Rest en funciones: APIs flexibles de argumentos

Cuando no sabes cuántos valores llegarán, `...args` es tu aliado.

1

Rest agrupa argumentos en un array real, lo que te permite iterar, validar y calcular sin depender del objeto `arguments` antiguo.

2

Coloca rest al final de la firma: solo puede haber un rest parameter y debe ser el último.

Errores de referencia compartida y cómo detectarlos

Si dos variables cambian a la vez, probablemente comparten referencia.

1

Asignar `const b = a` no copia arrays/objetos, solo copia la referencia. Por eso modificar `b` afecta `a`.

2

Para depurar, compara por identidad (`===`) y registra antes/después de cada operación.

🧪 Aprende probando

Ejemplo Ejemplo guiado: carrito sin mutación Añade productos y aplica descuento creando siempre nuevas estructuras.
Ejemplo Ejemplo guiado: función de etiquetas dinámicas Usa rest para aceptar un número variable de etiquetas y serializarlas.
Ejemplo Demo interactiva: combinar y filtrar tags Escribe tags separadas por coma, añade nuevas y visualiza copia inmutable en tiempo real.

🏁 Retos

Reto Reto 1: actualiza usuario sin mutar original Crea `usuarioActualizado` con spread cambiando solo `activo` y `rol`.
Reto Reto 2: función de suma con rest y validación Implementa `sumarValidos(...valores)` sumando solo números válidos mayores que 0.

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros. culTest

La hice en febrero de 2026 para facilitar el aprendizaje de mis alumnos. La idea es aprender desarrollo web practicando y que el proyecto siga creciendo con nuevos temas, tests y retos.

Está inspirada en MDN, W3Schools, CodePen, Manz y muchos otros sitios de documentación sobre desarrollo web. Quería combinar teoría útil, ejemplos ejecutables, retos y el sistema de tests que ya tenía en culTest. culTest

Si te gustó, si no te gustó o si quieres escribirme, puedes hacerlo en cristianeslava@gmail.com