Destructuring y spread en arrays JavaScript | Nicolás Garzón
El destructuring extrae valores según su posición. Spread expande un iterable dentro de otro contexto.
JavaScript
Copiar const values = [ "JavaScript" , "TypeScript" ] ;
const [ first, second] = values;
first;
second;
JavaScript
Copiar const coordinates = [ 4 , 8 ] ;
const [ x, y] = coordinates; Los nombres no dependen del array; los eliges según el significado.
JavaScript
Copiar const [ width, height] = coordinates; El contrato sigue siendo posicional: el primer binding recibe el primer valor.
JavaScript
Copiar const values = [ "A" , "B" , "C" ] ;
const [ , second] = values;
second; Demasiadas posiciones omitidas reducen claridad.
JavaScript
Copiar const [ , , , fourth] = values; Para estructuras complejas, un objeto con propiedades nombradas puede ser mejor.
JavaScript
Copiar const values = [ "dark" ] ;
const [ theme = "light" , language = "es" ] = values; El default se utiliza cuando el valor extraído es undefined o la posición no existe.
JavaScript
Copiar const [ value = "default" ] = [ null ] ;
value; null no activa el valor por defecto.
JavaScript
Copiar const values = [ 1 , 2 , 3 , 4 ] ;
const [ first, ... remaining] = values;
first;
remaining; El elemento rest debe estar al final y crea un array nuevo.
JavaScript
Copiar const [ ... copy] = values; JavaScript
Copiar const point = [ "A" , [ 10 , 20 ] ] ;
const [ name, [ x, y] ] = point; Utilízalo cuando la estructura sea estable y sencilla. Si los datos externos pueden cambiar, validar antes suele producir errores más claros.
JavaScript
Copiar let first = "A" ;
let second = "B" ;
[ first, second] = [ second, first] ; La expresión de la derecha se evalúa antes de actualizar los bindings.
JavaScript
Copiar const [ first, second] = values; Asignación sobre variables existentes:
JavaScript
Copiar let first;
let second;
[ first, second] = values; JavaScript
Copiar function divide ( dividend, divisor ) {
return [
Math. trunc ( dividend / divisor) ,
dividend % divisor,
] ;
}
const [ quotient, remainder] = divide ( 10 , 3 ) ; Un array funciona bien cuando:
Hay pocas posiciones.
El orden es obvio.
Los consumidores conocen el contrato.
Para muchos campos o valores opcionales, un objeto suele ser más legible.
JavaScript
Copiar const frontend = [ "React" , "Next.js" ] ;
const backend = [ "Node.js" , "PostgreSQL" ] ;
const stack = [ ... frontend, ... backend] ; Spread consume el protocolo iterable.
JavaScript
Copiar [ ... "JS" ] ;
[ ... new Set ( [ 1 , 2 , 2 ] ) ] ; Un objeto únicamente array-like puede no funcionar con spread si no es iterable.
JavaScript
Copiar const arrayLike = {
0 : "A" ,
length : 1 ,
} ;
Array. from ( arrayLike) ; JavaScript
Copiar const original = [
{ name : "Keyboard" } ,
] ;
const copy = [ ... original] ; El array exterior es nuevo, pero el objeto interior se comparte.
JavaScript
Copiar copy !== original;
copy[ 0 ] === original[ 0 ] ; JavaScript
Copiar copy[ 0 ] . name = "Mouse" ;
original[ 0 ] . name; Spread no crea una copia profunda.
JavaScript
Copiar const items = [ "A" , "B" ] ;
const appended = [ ... items, "C" ] ;
const prepended = [ "C" , ... items] ; JavaScript
Copiar const index = 1 ;
const next = [
... items. slice ( 0 , index) ,
"C" ,
... items. slice ( index) ,
] ; toSpliced ofrece una alternativa directa para modificaciones por posición.
JavaScript
Copiar const sparse = new Array ( 3 ) ;
const dense = [ ... sparse] ; El iterador del array produce undefined para cada posición vacía.
JavaScript
Copiar Object. hasOwn ( sparse, 0 ) ;
Object. hasOwn ( dense, 0 ) ;
dense; Spread puede convertir una estructura dispersa en una densa con valores undefined.
JavaScript
Copiar const values = [ 10 , 5 , 30 ] ;
Math. max ( ... values) ; Texto
Copiar rest: varios valores → un array
spread: iterable → varios valoresPara colecciones enormes, expandir todos los elementos como argumentos puede superar límites del runtime. Un recorrido o reducción puede ser más seguro.
JavaScript
Copiar function printRange ( [ start, end] ) {
return ` ${ start} - ${ end} ` ;
}
printRange ( [ 10 , 20 ] ) ; La función exige un iterable compatible con la estructura. Considera un objeto cuando start y end necesiten nombres explícitos en cada llamada.
JavaScript
Copiar const selectedIds = [
"product-1" ,
"product-2" ,
"product-3" ,
] ;
const [ primaryId, ... secondaryIds] = selectedIds; El destructuring comunica que la primera selección tiene un papel diferente y el resto forma otra colección.
Creer que los nombres se relacionan automáticamente con las posiciones.
Activar defaults con null.
Colocar rest antes del final.
Usar destructuring profundo sobre datos no validados.
Esperar una copia profunda con spread.
Intentar expandir un array-like que no es iterable.
Usar arrays posicionales para demasiados campos.
Expandir colecciones enormes como argumentos.
Ignorar que spread densifica holes como undefined.
El destructuring de arrays es posicional.
Puede omitir posiciones y definir defaults.
Rest reúne las posiciones restantes en un array nuevo.
Spread consume iterables.
Spread crea una copia superficial del array exterior.
Los objetos interiores continúan compartidos.
Es útil para combinar, anteponer y agregar sin mutar.
Los contratos posicionales deben mantenerse pequeños y claros.
¿Qué valores reciben los bindings?
JavaScript
Copiar const values = [ undefined , null , 3 , 4 ] ;
const [ first = 1 , second = 2 , ... rest] = values; Respuesta first recibe 1 porque el valor era undefined; second conserva null; rest recibe [3, 4].
Recorrer arrays compara índices, for...of, iteradores y forEach, incluyendo sus límites y contratos.