Lección 36: Spread Operator
🧠 Concepto
Section titled “🧠 Concepto”El spread operator (...) permite expandir elementos de arrays, objetos u otros iterables donde se esperan múltiples argumentos o elementos.
Spread en arrays
Section titled “Spread en arrays”// Clonar arraysconst original = [1, 2, 3];const copia = [...original];console.log(copia); // [1, 2, 3]console.log(copia === original); // false (distinta referencia)
// Fusionar arraysconst arr1 = [1, 2];const arr2 = [3, 4];const fusionado = [...arr1, ...arr2];console.log(fusionado); // [1, 2, 3, 4]
// Añadir elementosconst numeros = [1, 2, 3];const masNumeros = [0, ...numeros, 4, 5];console.log(masNumeros); // [0, 1, 2, 3, 4, 5]Spread en objetos
Section titled “Spread en objetos”// Clonar objetosconst punto = { x: 1, y: 2 };const copiaPunto = { ...punto };console.log(copiaPunto); // { x: 1, y: 2 }
// Fusionar objetos (el último prevalece en caso de conflicto)const defaults = { tema: 'claro', idioma: 'es', fontSize: 14 };const usuario = { tema: 'oscuro', idioma: 'en' };const configuracion = { ...defaults, ...usuario };console.log(configuracion);// { tema: 'oscuro', idioma: 'en', fontSize: 14 }
// Añadir propiedadesconst base = { nombre: 'Ana' };const completo = { ...base, edad: 28, ciudad: 'Madrid' };console.log(completo);// { nombre: 'Ana', edad: 28, ciudad: 'Madrid' }Spread en argumentos de función
Section titled “Spread en argumentos de función”const numeros = [4, 2, 9, 1, 7];console.log(Math.max(...numeros)); // 9console.log(Math.min(...numeros)); // 1
// Equivalente a Math.max.apply(null, numeros)💻 Ejemplo
Section titled “💻 Ejemplo”// Spread con stringsconst letras = [...'Hola'];console.log(letras); // ['H', 'o', 'l', 'a']
// Convertir NodeList a arrayconst parrafos = document.querySelectorAll('p');const arrayParrafos = [...parrafos];
// Spread combinado con destructuringconst [primero, segundo, ...resto] = [1, 2, 3, 4, 5];console.log(primero); // 1console.log(segundo); // 2console.log(resto); // [3, 4, 5]
// Spread en objetos anidados (copia superficial)const obj1 = { a: 1, b: { c: 2 } };const obj2 = { ...obj1 };obj2.b.c = 99;console.log(obj1.b.c); // 99 — copia superficial, el objeto anidado se comparte⚠️ Nota
Section titled “⚠️ Nota”Rest vs Spread: Ambos usan ... pero son opuestos:
- Rest: Agrupa elementos en un array (en parámetros de función o destructuring)
- Spread: Expande elementos desde un iterable
// Rest (agrupa)function sumar(...numeros) { // agrupa argumentos en un array return numeros.reduce((a, b) => a + b);}
// Spread (expande)const nums = [1, 2, 3];sumar(...nums); // expande el array en argumentos individualesEl spread en objetos solo hace copia superficial (shallow). Para deep clone necesitas structuredClone() o librerías.
Usa spread siempre que necesites copiar arrays/objetos de forma inmutable. Es más limpio y legible que concat(), slice(), o Object.assign(). Para evitar mutaciones accidentales en React/Vue, el spread es tu mejor aliado.
📝 Ejercicio
Section titled “📝 Ejercicio”Escribe una función combinarConfiguraciones que reciba dos objetos de configuración y devuelva uno fusionado. Las propiedades del segundo objeto deben sobrescribir las del primero.
function combinarConfiguraciones(config1, config2) { // Usa spread operator}
const base = { host: 'localhost', puerto: 3000, debug: false };const override = { puerto: 5000, debug: true };
console.log(combinarConfiguraciones(base, override));// { host: 'localhost', puerto: 5000, debug: true }