Проверяет понимание мутирующего поведения Array.prototype.sort и умение делать немутирующую сортировку через копию массива.
Метод Array.prototype.sort по спецификации ECMAScript сортирует массив на месте (in-place) и возвращает ссылку на тот же самый массив. Это значит, что после вызова arr.sort() исходный массив arr уже изменён, а возвращаемое значение — это тот же объект. Такое поведение часто становится источником багов, особенно в React и Redux, где мутация состояния ломает механизм сравнения ссылок и приводит к неожиданным ререндерам.
Внутри sort использует алгоритм сортировки (в V8 — TimSort) и переставляет элементы прямо в исходном массиве. Никакой новый массив не создаётся.
const nums = [3, 1, 2];
const result = nums.sort((a, b) => a - b);
console.log(nums); // [1, 2, 3] — оригинал изменён
console.log(result); // [1, 2, 3]
console.log(nums === result); // true — это один и тот же массив
Классический приём — сделать поверхностную копию массива и сортировать уже её. Для массива примитивов достаточно slice() или spread-оператора.
const nums = [3, 1, 2];
const sorted = [...nums].sort((a, b) => a - b);
console.log(nums); // [3, 1, 2] — оригинал не тронут
console.log(sorted); // [1, 2, 3]
Для массива объектов поверхностной копии достаточно, если вы не меняете сами объекты, а только их порядок. Если же внутри компаратора вы мутируете объекты — это уже отдельная проблема, и её решают через глубокое клонирование или иммутабельные обновления.
С 2023 года в стандарте появился Array.prototype.toSorted, который сразу возвращает новый массив и не трогает исходный. Это самый чистый способ немутирующей сортировки.
const nums = [3, 1, 2];
const sorted = nums.toSorted((a, b) => a - b);
console.log(nums); // [3, 1, 2]
console.log(sorted); // [1, 2, 3]
Поддержка есть в современных браузерах и Node.js 20+, но для старых окружений нужен полифил или транспиляция.
Итог: по умолчанию sort мутирует массив, поэтому для безопасной сортировки копируйте массив через spread или slice(), либо используйте toSorted(), если окружение его поддерживает.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию