> Почему метод shift мутирует массив и как сделать удаление первого элемента иммутабельно в JavaScript? (JavaScript)

Уровень: middle · Роль: frontend · Категория: Технические вопросы

Компании: Black Wall Group (BWG)

Стек: JavaScript

> Пример ответа

Короткий ответ

Метод shift мутирует исходный массив, потому что он изменяет его длину и сдвигает все элементы на одну позицию влево. Для иммутабельного удаления первого элемента можно использовать slice(1), filter((_, i) => i !== 0) или деструктуризацию с rest-оператором: const [first, ...rest] = array.

Подробное объяснение

shift - это мутирующий метод, который:

  • Удаляет первый элемент из массива
  • Сдвигает все остальные элементы на одну позицию влево (переиндексация)
  • Изменяет свойство length массива
  • Возвращает удаленный элемент

Иммутабельные альтернативы создают новый массив без первого элемента, не трогая исходный:

  • slice(1) - возвращает копию массива с элементами, начиная с индекса 1
  • filter((_, i) => i !== 0) - фильтрует по индексу
  • Деструктуризация с rest - const [first, ...rest] = array - создает новый массив rest без первого элемента

На практике

Выбор метода зависит от контекста:

  • В функциональном программировании и Redux-редьюсерах иммутабельность обязательна
  • В простых скриптах мутация может быть допустима, но лучше избегать для предсказуемости
  • slice(1) - самый производительный и читаемый вариант
  • Деструктуризация удобна, если нужен и удаленный элемент, и остаток

Пример кода

JAVASCRIPT
const arr = [1, 2, 3, 4, 5];
// Мутация
const removed = arr.shift(); // arr теперь [2, 3, 4, 5], removed = 1
// Иммутабельно
const arr2 = [1, 2, 3, 4, 5];
const newArr = arr2.slice(1); // [2, 3, 4, 5], arr2 не изменился
// Через filter
const newArr2 = arr2.filter((_, i) => i !== 0); // [2, 3, 4, 5]
// Через деструктуризацию
const [first, ...rest] = arr2; // first = 1, rest = [2, 3, 4, 5]

Как отвечать на собеседовании

Начни с прямого ответа: shift мутирует массив, потому что изменяет его длину и индексы. Затем перечисли иммутабельные альтернативы и объясни, когда какую использовать. Подчеркни важность иммутабельности в современном JavaScript, особенно в React и Redux. Упомяни, что slice(1) - наиболее идиоматичный способ.

Что проверяет интервьюер

  • Понимание разницы между мутацией и иммутабельностью
  • Знание методов работы с массивами
  • Умение выбирать правильный инструмент под задачу
  • Понимание принципов функционального программирования

Типичные ошибки

  • Путать shift с pop (удаляет с конца)
  • Думать, что slice мутирует массив (он создает копию)
  • Использовать splice(0, 1) как иммутабельный метод (он тоже мутирует)
  • Забывать, что деструктуризация создает новый массив, а не ссылку

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

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