În specificația ECMAScript 2023 (ES14), JavaScript a rezolvat una dintre cele mai mari surse de bug-uri accidentale: metodele istorice pe tablouri sort(), reverse() și splice() modificau (mutau) tabloul original direct în memorie (in-place mutation). În framework-uri reactive moderne precum React sau Redux, mutarea directă a stării previne re-randarea corectă a componentelor.
Noile metode Change Array by Copy returnează întotdeauna o copie nouă a tabloului cu modificarea aplicată, lăsând tabloul sursă complet intact și imutabil.
// Tabloul original de pornire
const numere = [40, 10, 100, 25, 5];
// 1. toSorted() în loc de sort() - sortează fără a modifica originalul
const numereSortate = numere.toSorted((a, b) => a - b);
console.log(numereSortate); // [5, 10, 25, 40, 100]
console.log(numere); // [40, 10, 100, 25, 5] (originalul este neschimbat!)
// 2. toReversed() în loc de reverse()
const inversate = numere.toReversed();
console.log(inversate); // [5, 25, 100, 10, 40]
// 3. toSpliced(start, deleteCount, ...items) în loc de splice()
// Șterge 1 element de la indexul 1 și inserează 999
const cuInlocuire = numere.toSpliced(1, 1, 999);
console.log(cuInlocuire); // [40, 999, 100, 25, 5]
// 4. with(index, valoareNoua) - actualizează un singur element imutabil
// Înlocuiește sintaxa greoaie [...arr.slice(0, 2), 'nou', ...arr.slice(3)]
const utilizatori = ['Andrei', 'Elena', 'Mihai'];
const actualizati = utilizatori.with(1, 'Elena Popescu');
console.log(actualizati); // ['Andrei', 'Elena Popescu', 'Mihai']
console.log(utilizatori); // ['Andrei', 'Elena', 'Mihai']
Indexare Negativă
Toate aceste metode acceptă indexare negativă (introdusă cu metoda at()). De exemplu, arr.with(-1, 'ultimul') va înlocui ultimul element al copiei fără a fi nevoie să calculezi manual arr.length - 1.