Métodos mutables y no mutables de arrays JavaScript | Nicolás Garzón
Algunos métodos modifican el mismo array; otros devuelven otro valor sin cambiar la colección original.
JavaScript
Copiar const values = [ 1 , 2 , 3 ] ;
values. push ( 4 ) ;
const next = values. concat ( 5 ) ; JavaScript
Copiar const values = [ 3 , 1 , 2 ] ;
const result = values. sort ( ) ;
result === values; JavaScript
Copiar const values = [ 3 , 1 , 2 ] ;
const result = values. toSorted ( ) ;
result === values;
values; JavaScript
Copiar const stack = [ "A" , "B" ] ;
stack. push ( "C" ) ;
stack. pop ( ) ; JavaScript
Copiar const appended = [ ... stack, "C" ] ;
const withoutLast = stack. slice ( 0 , - 1 ) ; Para leer y separar el último:
JavaScript
Copiar const last = stack. at ( - 1 ) ;
const rest = stack. slice ( 0 , - 1 ) ; JavaScript
Copiar const queue = [ "B" , "C" ] ;
queue. unshift ( "A" ) ;
queue. shift ( ) ; Ambos mutan. Trabajar repetidamente en el inicio puede implicar reorganizar índices y suele ser menos conveniente para colas grandes.
JavaScript
Copiar const prepended = [ "A" , ... queue] ;
const withoutFirst = queue. slice ( 1 ) ; Crear copias también cuesta memoria; no significa que siempre sea más rápido. La elección depende de identidad compartida, legibilidad y volumen.
splice puede eliminar, insertar o reemplazar elementos y modifica el original.
JavaScript
Copiar const values = [ "A" , "B" , "C" ] ;
const removed = values. splice ( 1 , 1 , "X" , "Y" ) ;
values;
removed; Texto
Copiar splice(inicio, cantidadAEliminar, ...elementosAInsertar)Produce otro array con la misma operación posicional.
JavaScript
Copiar const values = [ "A" , "B" , "C" ] ;
const next = values. toSpliced ( 1 , 1 , "X" ) ;
values;
next; JavaScript
Copiar const scores = [ 10 , 2 , 30 ] ;
scores. sort ( ( first, second ) => first - second) ; sort muta. toSorted conserva el original.
JavaScript
Copiar const ordered = scores. toSorted (
( first, second ) => first - second,
) ; La comparación se profundiza en Ordenamiento de arrays .
JavaScript
Copiar const values = [ 1 , 2 , 3 ] ;
values. reverse ( ) ; JavaScript
Copiar const reversed = values. toReversed ( ) ; JavaScript
Copiar const values = [ "A" , "B" , "C" ] ;
const next = values. with ( 1 , "X" ) ;
values;
next; with acepta índices negativos.
JavaScript
Copiar values. with ( - 1 , "X" ) ; Lanza RangeError si el índice está fuera del rango válido, a diferencia de una asignación normal que puede extender el array.
JavaScript
Copiar const values = new Array ( 3 ) . fill ( 0 ) ;
fill modifica el array y devuelve la misma referencia.
Puede limitarse a un rango.
JavaScript
Copiar [ 1 , 2 , 3 , 4 ] . fill ( 0 , 1 , 3 ) ;
JavaScript
Copiar const rows = new Array ( 3 ) . fill ( { active : false } ) ;
rows[ 0 ] . active = true ;
rows[ 1 ] . active; Todas las posiciones apuntan al mismo objeto.
Para crear objetos independientes:
JavaScript
Copiar const rows = Array. from (
{ length : 3 } ,
( ) => ( { active : false } ) ,
) ; Copia una parte del mismo array hacia otra posición y lo modifica.
JavaScript
Copiar const values = [ 1 , 2 , 3 , 4 , 5 ] ;
values. copyWithin ( 0 , 3 ) ;
values; No cambia la longitud. Es una operación de bajo nivel útil en casos concretos; slice, spread o una transformación con nombres suelen ser más legibles.
Crea una copia superficial de un rango.
JavaScript
Copiar const values = [ "A" , "B" , "C" , "D" ] ;
values. slice ( 1 , 3 ) ;
values. slice ( ) ;
values. slice ( - 2 ) ; El índice final no se incluye.
JavaScript
Copiar const first = [ 1 , 2 ] ;
const second = [ 3 , 4 ] ;
const combined = first. concat ( second, 5 ) ; No modifica los arrays de entrada y crea una copia superficial.
Spread suele comunicar lo mismo:
JavaScript
Copiar const combined = [ ... first, ... second, 5 ] ; Muta Alternativa habitual `push` `[...array, value]` `pop` `slice(0, -1)` `unshift` `[value, ...array]` `shift` `slice(1)` `splice` `toSpliced` `sort` `toSorted` `reverse` `toReversed` Asignar índice `with` `fill` `map` o `Array.from` según el propósito
Mutación problemática cuando otras partes dependen de una referencia nueva:
JavaScript
Copiar state. items. push ( item) ;
setState ( state) ; JavaScript
Copiar setState ( {
... state,
items : [ ... state. items, item] ,
} ) ; La nueva referencia permite detectar el cambio. Los elementos interiores continúan compartidos salvo que también se copien.
La mutación no es automáticamente incorrecta.
JavaScript
Copiar function buildIndex ( products ) {
const result = [ ] ;
for ( const product of products) {
result. push ( {
id : product. id,
name : product. name,
} ) ;
}
return result;
} result es local y no se comparte antes del retorno. push puede ser claro y seguro.
El riesgo aparece con referencias compartidas, contratos inesperados o estado observable desde otros lugares.
JavaScript
Copiar const next = [ ... largeArray, value] ; Crear otro array requiere copiar referencias. En colecciones grandes o actualizaciones muy frecuentes, mide el costo y considera estructuras o estrategias apropiadas.
No sacrifiques identidad correcta y claridad por una optimización imaginada; tampoco copies automáticamente sin evaluar el uso.
Llamar sort o reverse sobre datos que deben conservarse.
Creer que el retorno de push es el array.
Confundir slice con splice.
Crear objetos compartidos con fill({}).
Suponer que métodos no mutables crean copias profundas.
Creer que toda mutación local es mala.
Copiar arrays enormes sin considerar el costo.
Usar asignación de índice cuando with comunica una actualización inmutable.
Esperar que with extienda el array.
Los métodos mutables conservan la misma referencia.
push, pop, shift, unshift, splice, sort, reverse, fill y copyWithin mutan.
slice, concat, toSpliced, toSorted, toReversed y with producen otro array.
Las copias son superficiales.
fill con objetos repite la misma referencia.
Mutación local puede ser razonable; mutación compartida requiere cuidado.
Elegir una copia tiene costo, pero también puede ofrecer un contrato más seguro.
¿Por qué este código modifica todas las filas?
JavaScript
Copiar const rows = new Array ( 3 ) . fill ( { active : false } ) ;
rows[ 0 ] . active = true ; Respuesta fill colocó la misma referencia de objeto en las tres posiciones. Debe crearse un objeto nuevo por posición, por ejemplo con Array.from({ length: 3 }, () => ({ active: false })).
map, filter y flatMap estudia transformaciones declarativas que producen nuevas colecciones mediante callbacks.