За обновлениями можно следить в telegram-канале https://t.me/quasiart

В стандарте ECMAScript 2023 (14-е издание) появились новые методы прототипа Array.

Общим направлением этих четырёх новых методов является стремление не изменять исходный массив, а возвращать новый массив, как это делается в методах map и filter. Но эта статья не о плюсах иммутабельности.

toReversed

Метод toReversed похож на метод reverse, но с одним важным отличием. Метод toReversed переворачивает элементы массива без мутации исходного массива.

Допустим, имеется такой массив:

const fruits = ['apple', 'orange', 'banana']

Теперь перевернём массив с помощью reverse:

const result = fruits.reverse()
console.log(result) 

// ['banana', 'orange', 'apple']

console.log(fruits)
// ["banana", "orange", "apple"]

Оригинальный массив изменился.

Теперь перевернём массив с помощью toReversed:

const result = fruits.toReversed()
console.log(result) 

// ['banana', 'orange', 'apple']

console.log(fruits)
// ["apple", "orange", "banana"] 

Перевернуть строку можно следующим образом:

const value = "Hello World"

Array.prototype.toReversed.call(value)

// ['d', 'l', 'r', 'o', 'W', ' ', 'o', 'l', 'l', 'e', 'H']

toSorted

toSorted является аналогом метода sort.

В отличие от sort, метод toSorted не будет мутировать исходный массив.

Рассмотрим пример работы метода sort ниже. Как видим, исходный массив мутировал.

const list = [1, 5, 6, 3, 7, 8, 3, 7]
const result = list.sort()

console.log(result)
// [1, 3, 3, 5, 6, 7, 7, 8]
console.log(list)
// [1, 3, 3, 5, 6, 7, 7, 8]

Теперь посмотрим на работу toSorted. Исходный массив не изменился.

const list = [1, 5, 6, 3, 7, 8, 3, 7]
// Sort in ascending order 
const result = list.toSorted()

console.log(result)
// [1, 3, 3, 5, 6, 7, 7, 8]
console.log(list)
// [1, 5, 6, 3, 7, 8, 3, 7]

Сортировка строки:

const value = 'Hello World'
Array.prototype.toSorted.call(value)
// [' ', 'H', 'W', 'd', 'e', 'l', 'l', 'l', 'o', 'o', 'r']

toSpliced

toSpliced — аналог метода splice. Метод toSpliced не будет мутировать массив, в отличие от splice.

Синтаксис toSpliced идентичен синтаксису .splice, как показано ниже:

toSpliced(start)
toSpliced(start, deleteCount)
toSpliced(start, deleteCount, item1)
toSpliced(start, deleteCount, item1, item2, itemN)

Вставка нового элемента в массив с помощью splice:

const months = ["Feb", "Mar", "Apr", "May"] 
// Insert item "Jan" at index 0 and delete 0 items
months.splice(0, 0, "Jan")

console.log(months) 
//  ['Jan', 'Feb', 'Mar', 'Apr', 'May']

А вот этот же код, но переписанный на использование toSpliced:

const months = ["Feb", "Mar", "Apr", "May"] 
// Вставляем "Jan" по индексу 0 и удаляем 0 элементов
const updatedMonths = months.toSpliced(0, 0, "Jan")

console.log(updatedMonths)
// ['Jan', 'Feb', 'Mar', 'Apr', 'May']
console.log(months)
// ['Feb', 'Mar', 'Apr', 'May']

Как с помощью метода toSpliced вставить и удалить символы в строке:

const value = 'дядя Миша'
// Начиная с индекса 6 удаляем 1 элемент ("и") и вставляем новый ("а")
console.log(Array.prototype.toSpliced.call(value, 6, 1, 'a'))
// ['д', 'я', 'д', 'я', ' ', 'М', 'a', 'ш', 'а']

with

Сначала рассмотрим обозначение скобок для изменения значения определенного индекса массива:

const favorites = ["Dogs", "Cats"]
favorites[0] = "Lions"

console.log(favorites)
// ['Lions', 'Cats']

При использовании скобок исходный массив всегда изменяется. Метод with позволяет достичь того же результата при вставке элемента по определённому индексу, но не изменяет массив. Вместо этого он возвращает новый массив с заменённым элементом.

Давайте перепишем пример с использованием with:

const favorites = ["Dogs", "Cats"]
const result = favorites.with(0, "Lions")

console.log(result)
// ['Lions', 'Cats']
console.log(favorites)
// ["Dogs", "Cats"]

Пример со строкой:

const value = 'Bat'

console.log(Array.prototype.with.call(value, 0, 'C'))
// ['C', 'a', 't']

Заключение

Пишите декларативный и чистый код. Если будете в ресурсе, и не воспринимаете мою просьбу как манипуляцию, и не видите в этом абъюзивного контроля, и это не триггерит ваши детские травмы от гиперопекающих родителей.