> Изменяется ли исходный массив при вызове метода sort в JavaScript и почему (JavaScript)
Уровень: middle · Роль: frontend · Категория: Технические вопросы
Компании: ITFB, Сбер
Стек: JavaScript
> Пример ответа
Короткий ответ
Да, метод sort изменяет исходный массив - это метод мутации (in-place). Он сортирует элементы массива на месте и возвращает ссылку на тот же самый массив, а не создаёт копию. Это поведение закреплено в спецификации ECMAScript и отличается от многих других методов массива (map, filter, reduce), которые возвращают новый массив.
Подробное объяснение
Метод Array.prototype.sort работает непосредственно с исходным массивом, переставляя его элементы. Это значит, что после вызова sort исходный массив будет переупорядочен, и ссылка на него останется той же.
Причина такого поведения - историческая и дизайнерская: sort был одним из первых методов массива в JavaScript, и его сделали мутирующим для эффективности (не нужно выделять память под новый массив при сортировке больших объёмов данных). Это согласуется с другими мутирующими методами, такими как reverse, push, pop, splice.
Важно понимать, что sort возвращает тот же массив, поэтому следующий код не создаёт копию:
JAVASCRIPTconst arr = [3, 1, 2];const sorted = arr.sort();console.log(arr === sorted); // true
Если нужно отсортировать без изменения исходного массива, необходимо сначала создать копию - например, через slice(), concat() или spread-оператор.
На практике
На практике это поведение важно учитывать, когда исходный массив используется в нескольких местах или передаётся в другие функции. Если не ожидать мутации, можно получить неожиданные побочные эффекты.
Типичный паттерн для сортировки без мутации:
JAVASCRIPTconst sorted = [...arr].sort();
Или:
JAVASCRIPTconst sorted = arr.slice().sort();
Также стоит помнить, что sort по умолчанию сортирует элементы как строки (лексикографически), поэтому для числовой сортировки нужно передавать функцию сравнения.
Пример кода
JAVASCRIPT// Мутация исходного массиваconst numbers = [10, 5, 8, 1];const result = numbers.sort((a, b) => a - b);console.log(numbers); // [1, 5, 8, 10] - исходный массив изменёнconsole.log(result === numbers); // true - возвращена та же ссылка// Как избежать мутацииconst original = [3, 1, 2];const sortedCopy = [...original].sort((a, b) => a - b);console.log(original); // [3, 1, 2] - не изменилсяconsole.log(sortedCopy); // [1, 2, 3] - новая отсортированная копия
Как отвечать на собеседовании
Начните с прямого ответа: "Да, изменяется". Затем поясните, что это метод мутации, и он возвращает ссылку на тот же массив. Упомяните, что это поведение зафиксировано в спецификации и отличается от иммутабельных методов. Если спросят про альтернативы - покажите, как сделать копию перед сортировкой. Хорошо также упомянуть, что sort сортирует по умолчанию как строки, и для чисел нужна функция сравнения.
Что проверяет интервьюер
Интервьюер проверяет понимание мутабельности массивов в JavaScript, знание спецификации и умение предвидеть побочные эффекты. Это базовый вопрос на уровень middle - ожидается чёткий ответ без раздумий, плюс понимание практических последствий.
Типичные ошибки
- Утверждение, что
sortвозвращает новый массив - это неверно. - Забывают, что
sortсортирует как строки по умолчанию, и не передают компаратор для чисел. - Не упоминают способ избежать мутации (копирование через spread или
slice). - Путают
sortс иммутабельными методами вродеtoSorted(новый метод в ES2023, который как раз возвращает копию - но он ещё не везде поддерживается).
> Похожие задачи по frontend
Какой метод вызывается при наследовании, если метод определён в прототипе родителя и в экземпляре дочернего класса в JavaScript
Как отлавливать ошибки промисов в JavaScript
Что такое самовызывающаяся функция (IIFE) в JavaScript
Как работать с Promise в цепочках
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью