> Почему метод 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)- возвращает копию массива с элементами, начиная с индекса 1filter((_, i) => i !== 0)- фильтрует по индексу- Деструктуризация с rest -
const [first, ...rest] = array- создает новый массивrestбез первого элемента
На практике
Выбор метода зависит от контекста:
- В функциональном программировании и Redux-редьюсерах иммутабельность обязательна
- В простых скриптах мутация может быть допустима, но лучше избегать для предсказуемости
slice(1)- самый производительный и читаемый вариант- Деструктуризация удобна, если нужен и удаленный элемент, и остаток
Пример кода
JAVASCRIPTconst 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 не изменился// Через filterconst 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)как иммутабельный метод (он тоже мутирует) - Забывать, что деструктуризация создает новый массив, а не ссылку
> Похожие задачи по frontend
Как в SSR составляется состояние для рендера?
В каком порядке срабатывают события при нажатии на кнопку и почему
Что происходит при проверке статуса Promise в JavaScript, если он может выполниться раньше?
Куда пойдет выполнение при конкурентном запуске нескольких задач в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью