Command Palette

Search for a command to run...

Concatenación de Arrays: concat() vs Spread Operator

Aprende a combinar múltiples arrays usando el método tradicional concat() y el moderno operador spread (...), sus diferencias, ventajas y cuándo usar cada uno.

Lectura: 12 min
Nivel: Principiante

TL;DR - Resumen rápido

  • El método concat() combina arrays sin modificar los originales, retornando un nuevo array
  • El operador spread (...) es una sintaxis ES6 más moderna y legible para concatenar arrays
  • Ambos métodos crean copias superficiales (shallow copies) de los arrays
  • El spread operator es más flexible y permite mezclar arrays con valores individuales fácilmente
  • Para arrays anidados o con objetos, la concatenación es superficial: los elementos internos comparten referencias

Introducción a la Concatenación de Arrays

La concatenación de arrays es una operación fundamental en JavaScript que te permite combinar dos o más arrays en uno solo. Esta técnica es esencial cuando trabajas con colecciones de datos que necesitas unir, como listas de usuarios, productos o resultados de consultas. JavaScript ofrece dos formas principales de lograr esto: el método tradicional concat() y el operador spread (...) introducido en ES6.

Entender ambas opciones es crucial porque, aunque logran el mismo resultado, tienen diferencias importantes en sintaxis, flexibilidad y rendimiento. La concatenación es una operación inmutable: no modifica los arrays originales, sino que crea un nuevo array con los elementos combinados. Este comportamiento es fundamental para escribir código predecible y evitar efectos secundarios no deseados.

Inmutabilidad en JavaScript

Los métodos de concatenación crean copias superficiales (shallow copies) de los arrays. Esto significa que el nuevo array contiene referencias a los mismos objetos que los arrays originales. Si los elementos son objetos primitivos (números, strings), se copian por valor. Si son objetos o arrays, se copian por referencia.

El Método concat()

El método concat() es la forma tradicional de concatenar arrays en JavaScript, disponible desde las primeras versiones del lenguaje. Este método pertenece al prototipo de Array y puede ser llamado en cualquier array existente. Su sintaxis es simple y directa, y devuelve un nuevo array que contiene los elementos del array original seguidos por los elementos de los arrays o valores proporcionados como argumentos.

Una de las características más importantes de concat() es que no modifica el array original, sino que retorna uno nuevo. Este comportamiento inmutable es una buena práctica en programación funcional y ayuda a evitar bugs sutiles que pueden ocurrir cuando se mutan datos compartidos entre diferentes partes de una aplicación.

Uso Básico de concat()

Para concatenar dos arrays, simplemente llama al método concat() en el primer array y pasa el segundo como argumento. El resultado es un nuevo array que contiene todos los elementos del primer array seguidos por los del segundo.

concat-basico.js
Loading code...

En este ejemplo, frutas y verduras permanecen sin cambios. El método concat() crea un nuevo array alimentos que contiene todos los elementos de ambos arrays en el orden especificado. Este comportamiento garantiza que los arrays originales no se vean afectados por la operación de concatenación.

Concatenar Múltiples Arrays

El método concat() acepta múltiples argumentos, lo que te permite concatenar más de dos arrays en una sola operación. Cada argumento adicional se añade al resultado en el orden en que se proporciona.

concat-multiples.js
Loading code...

Al concatenar múltiples arrays, el orden de los argumentos determina el orden final de los elementos. El array desde el que llamas a concat() siempre estará primero, seguido por cada argumento en el orden especificado. Esta flexibilidad te permite construir arrays complejos combinando varias fuentes de datos de forma controlada.

Concatenar Arrays con Valores Individuales

Además de arrays, concat() también puede aceptar valores individuales como argumentos. Estos valores se añaden al final del nuevo array como elementos separados. Esta característica es útil cuando necesitas agregar elementos específicos a un array existente sin modificarlo.

concat-valores.js
Loading code...

Puedes mezclar arrays y valores individuales en la misma llamada a concat(). Cada valor individual se agrega como un elemento separado al resultado final. Esta combinación de arrays y valores te permite construir arrays personalizados de forma flexible sin necesidad de múltiples operaciones.

Arrays anidados con concat()

concat() aplana solo UN nivel de anidación. Si pasas [1, 2].concat([3, [4, 5]]), el resultado será [1, 2, 3, [4, 5]] (el array [4, 5] permanece anidado). El spread operator no aplana ningún nivel: [...[1, 2], ...[3, [4, 5]]] también da [1, 2, 3, [4, 5]]. Ambos mantienen arrays profundamente anidados intactos.

El Operador Spread (...)

El operador spread (...) es una sintaxis introducida en ES6 (ECMAScript 2015) que permite expandir elementos iterables como arrays en lugares donde se esperan múltiples elementos. Para concatenar arrays, el spread operator se usa dentro de los corchetes de un nuevo array literal, expandiendo los elementos de cada array fuente en el nuevo array resultante.

El spread operator ofrece una sintaxis más moderna y expresiva que concat(), y se ha convertido en la forma preferida de concatenar arrays en JavaScript moderno. Su ventaja principal es la legibilidad: es más intuitivo ver los elementos expandiéndose directamente en el nuevo array que llamar a un método. Además, el spread operator es más flexible y permite mezclar arrays con valores individuales de forma natural.

Uso Básico del Spread

Para concatenar dos arrays con el operador spread, crea un nuevo array literal y usa ... antes de cada array que quieras expandir. Los elementos de cada array se expanden en el nuevo array en el orden especificado.

spread-basico.js
Loading code...

El spread operator expande los elementos de frutas y verduras directamente en el nuevo array alimentos. Esta sintaxis es más declarativa y fácil de leer que concat(), especialmente para desarrolladores que están familiarizados con otras características de ES6. Al igual que concat(), el spread operator no modifica los arrays originales.

Concatenar Múltiples Arrays con Spread

Concatenar múltiples arrays con el spread operator es tan simple como agregar más expresiones spread dentro del array literal. Cada array se expande en orden, creando un nuevo array con todos los elementos combinados.

spread-multiples.js
Loading code...

El spread operator maneja múltiples arrays de forma natural. Cada expresión ...array expande los elementos correspondientes en el nuevo array. Esta sintaxis es especialmente clara cuando concatenas muchos arrays, ya que puedes ver exactamente qué arrays se están combinando y en qué orden.

Mezclar Arrays y Valores con Spread

Una de las ventajas más poderosas del spread operator es la facilidad con que puedes mezclar arrays y valores individuales en un solo array literal. Simplemente coloca los valores directamente entre las expresiones spread donde los necesites.

spread-valores.js
Loading code...

El spread operator te permite insertar valores individuales en cualquier posición dentro del nuevo array, no solo al principio o al final. Esta flexibilidad es superior a concat(), que solo puede añadir valores al final del resultado. Puedes crear arrays personalizados combinando múltiples fuentes de datos y valores específicos de forma muy expresiva.

Ventaja del Spread: Posicionamiento Flexible

Con el spread operator, puedes insertar valores en cualquier posición: [...array1, valor, ...array2]. Con concat(), solo puedes añadir valores al final: array1.concat(array2, valor). Esta flexibilidad hace que el spread operator sea más versátil para construir arrays complejos.

Comparación: concat() vs Spread

Tanto concat() como el spread operator logran el mismo resultado básico: concatenar arrays sin modificar los originales. Sin embargo, hay diferencias importantes que debes considerar al elegir cuál usar en tu código.

  • <strong>Sintaxis:</strong> El spread operator usa una sintaxis más moderna y legible (<code>[...a, ...b]</code>) comparado con <code>concat()</code> (<code>a.concat(b)</code>)
  • <strong>Flexibilidad:</strong> El spread permite insertar valores en cualquier posición, mientras que <code>concat()</code> solo añade valores al final
  • <strong>Arrays anidados:</strong> Ambos métodos manejan arrays anidados de la misma forma: expanden un nivel y mantienen estructuras anidadas intactas
  • <strong>Compatibilidad:</strong> <code>concat()</code> funciona en todos los navegadores, el spread requiere ES6 o polyfills
  • <strong>Rendimiento:</strong> En arrays grandes, <code>concat()</code> puede ser ligeramente más rápido en algunos motores de JavaScript

Para código moderno donde ES6 está disponible, el spread operator es generalmente preferido por su sintaxis más clara y su mayor flexibilidad. Sin embargo, si necesitas soportar navegadores muy antiguos o estás trabajando en un entorno donde ES6 no está disponible, concat() sigue siendo una opción confiable.

comparacion-concat-spread.js
Loading code...

Este ejemplo demuestra que ambos métodos manejan arrays anidados de la misma forma: ambos expanden un nivel y mantienen arrays anidados intactos. La verdadera diferencia está en la flexibilidad sintáctica: el spread operator permite insertar valores en cualquier posición del nuevo array, mientras que concat() solo puede añadir elementos al final.

Errores Comunes

Al trabajar con la concatenación de arrays, hay varios errores comunes que los desarrolladores cometen, especialmente cuando están aprendiendo. Estos errores pueden llevar a resultados inesperados, bugs sutiles o código difícil de mantener.

Error: Asignar el resultado de spread sin crear un nuevo array

Un error común es intentar usar el spread operator fuera de un array literal. El spread solo funciona dentro de corchetes [] o como argumentos de función. Usarlo directamente causará un error de sintaxis.

error-asignacion-spread.js
Loading code...

El spread operator necesita un contexto donde expandir los elementos. En una asignación directa, no hay un destino para los elementos expandidos, por lo que JavaScript lanza un error de sintaxis. Siempre usa el spread dentro de un array literal o como argumento de función.

Error: Intentar modificar el array original

Otro error común es pensar que concat() o el spread operator modifican el array original. Ambos métodos crean un nuevo array y dejan el original sin cambios. Si necesitas modificar el array original, debes reasignar el resultado.

error-modificar-original.js
Loading code...

En este ejemplo, concat() no modifica numeros. Para actualizar el array original, debes reasignar el resultado: numeros = numeros.concat([4, 5]). El mismo principio aplica al spread operator. Este comportamiento inmutable es una característica, no un bug, y ayuda a prevenir efectos secundarios no deseados.

Error: Asumir que la concatenación crea copias profundas

Un error peligroso es asumir que concatenar arrays con objetos crea copias independientes de esos objetos. La concatenación crea copias superficiales, lo que significa que los objetos dentro de los arrays comparten la misma referencia. Modificar un objeto en el nuevo array también lo modificará en el array original.

error-referencias-objetos.js
Loading code...

Aunque nuevoArray es un array diferente, contiene referencias a los mismos objetos que arrayOriginal. Cuando modificas nuevoArray[0].valor, también estás modificando arrayOriginal[0].valor porque ambos apuntan al mismo objeto en memoria. Para crear copias profundas de objetos, necesitas usar técnicas como JSON.parse(JSON.stringify()) o bibliotecas especializadas.

Advertencia sobre Copias Superficiales

La concatenación de arrays siempre crea copias superficiales. Si tus arrays contienen objetos o arrays anidados, estos elementos compartirán referencias entre el array original y el concatenado. Para copias profundas, considera usar structuredClone() (navegadores modernos) o bibliotecas como Lodash.

Resumen: Concatenación de Arrays

Conceptos principales:

  • concat() es el método tradicional para combinar arrays, disponible en todas las versiones de JavaScript
  • El operador spread (...) es una sintaxis ES6 más moderna y legible para concatenar arrays
  • Ambos métodos crean copias superficiales sin modificar los arrays originales
  • El spread operator permite insertar valores en cualquier posición del nuevo array
  • Ambos métodos manejan arrays anidados de la misma forma: expanden un nivel y mantienen anidación profunda

Mejores prácticas:

  • Usa el spread operator en código moderno ES6+ por su sintaxis más clara y flexible
  • Usa concat() si necesitas soportar navegadores muy antiguos sin transpilación
  • Recuerda que la concatenación es superficial: los objetos comparten referencias
  • Para copias profundas de objetos, usa structuredClone() o bibliotecas especializadas
  • Siempre asigna el resultado de la concatenación a una variable nueva o reasigna la existente