Для чего используется метод reverse у массивов в JavaScript
Что проверяют
Главное: знаете ли вы, что reverse() меняет исходный массив. Следом почти всегда спрашивают, как развернуть массив без мутации и чем мутация опасна в React.
Как отвечать
reverse() разворачивает порядок элементов на месте и возвращает ссылку на тот же массив, а не новый:
const a = [1, 2, 3];
const b = a.reverse();
b === a; // true, и a теперь [3, 2, 1]Способы без мутации:
toReversed(): появился в ES2023, возвращает новый массив и не трогает исходный. Есть во всех современных браузерах, для старых окружений нужен полифил;[...arr].reverse()илиarr.slice().reverse(): копия и разворот копии, работает везде.
Детали, которые стоит назвать:
- это не сортировка:
reverse()просто переворачивает текущий порядок. Для сортировки по убыванию нуженsort()илиtoSorted()с компаратором; - разреженные массивы:
reverse()сохраняет дыры,toReversed()превращает их вundefined; - строки: у строк такого метода нет, обычно пишут
[...str].reverse().join(""). Спред делит строку по кодовым точкам, поэтому эмодзи из суррогатной пары не ломается, в отличие отsplit(""). Составные эмодзи и символы с диакритикой всё равно развалятся, для них нуженIntl.Segmenter; - сложность: O(n), дополнительной памяти
reverse()не выделяет.
Типичное применение во фронтенде: показать ленту новыми сверху, если API отдаёт записи по возрастанию.
Где спотыкаются
Вызывают items.reverse() прямо в рендере React-компонента на массиве из пропсов или стейта. Массив мутируется, и при каждом ререндере порядок переворачивается снова. Нужен toReversed() или копия.
Отвечают, что reverse() возвращает новый массив. Это путаница с map и filter, и именно на ней ловят.
Разворачивают строку через split("").reverse().join("") и не знают, что так ломаются эмодзи.