> Изменяется ли исходный массив при вызове метода 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 возвращает тот же массив, поэтому следующий код не создаёт копию:

JAVASCRIPT
const arr = [3, 1, 2];
const sorted = arr.sort();
console.log(arr === sorted); // true

Если нужно отсортировать без изменения исходного массива, необходимо сначала создать копию - например, через slice(), concat() или spread-оператор.

На практике

На практике это поведение важно учитывать, когда исходный массив используется в нескольких местах или передаётся в другие функции. Если не ожидать мутации, можно получить неожиданные побочные эффекты.

Типичный паттерн для сортировки без мутации:

JAVASCRIPT
const sorted = [...arr].sort();

Или:

JAVASCRIPT
const 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, который как раз возвращает копию - но он ещё не везде поддерживается).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью