> Почему метод splice в JavaScript возвращает вырезанные элементы и является ли он мутабельным (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Иннотех
Стек: JavaScript
> Пример ответа
Короткий ответ
splice - мутабельный метод массива, который изменяет исходный массив и возвращает массив удалённых элементов (или пустой массив, если ничего не удалено). Возвращаемое значение - это новый массив, содержащий вырезанные элементы, а не ссылка на исходный. Мутация происходит in-place: исходный массив модифицируется сразу, без создания копии.
Подробное объяснение
splice является мутабельным, потому что он напрямую изменяет исходный массив: удаляет, заменяет или добавляет элементы на указанных позициях. Это принципиальное отличие от иммутабельных методов, таких как slice, concat или spread-оператор, которые возвращают новый массив.
Возвращаемое значение splice - всегда новый массив, содержащий удалённые элементы. Если удаления не произошло (например, при start за пределами массива или deleteCount = 0), возвращается пустой массив. Это важно: возвращается именно массив, а не undefined или null, что позволяет безопасно использовать результат в цепочках.
Сигнатура: array.splice(start, deleteCount, item1, item2, ...). Параметры:
start- индекс, с которого начинать изменение. Отрицательные значения отсчитываются с конца.deleteCount- количество удаляемых элементов (опционально, по умолчанию до конца массива).itemN- элементы для вставки на место удалённых.
Мутация происходит следующим образом: элементы после start сдвигаются, массив изменяет свою длину. Это может быть неэффективно для больших массивов, так как требует переиндексации.
На практике
splice часто используют для удаления элемента по индексу, замены элемента или вставки в середину массива. Однако из-за мутации его нужно применять осторожно, особенно если массив используется в нескольких местах (например, в React-состоянии или Redux store). В таких случаях предпочтительнее иммутабельные подходы: filter, slice + spread.
Для удаления одного элемента по индексу: arr.splice(index, 1). Для замены: arr.splice(index, 1, newValue). Для вставки без удаления: arr.splice(index, 0, newValue).
Важно помнить, что splice возвращает массив удалённых элементов, а не сам массив. Это часто путают с slice, который возвращает копию части массива без мутации.
Пример кода
JAVASCRIPTconst arr = [1, 2, 3, 4, 5];// Удаление 2 элементов, начиная с индекса 1const removed = arr.splice(1, 2);console.log(arr); // [1, 4, 5]console.log(removed); // [2, 3]// Вставка без удаленияarr.splice(1, 0, 10, 20);console.log(arr); // [1, 10, 20, 4, 5]// Замена: удалить 1 элемент и вставить новыйarr.splice(2, 1, 30);console.log(arr); // [1, 10, 30, 4, 5]// Отрицательный startarr.splice(-2, 1);console.log(arr); // [1, 10, 30, 5]// deleteCount = 0 - возвращает пустой массивconst empty = arr.splice(0, 0, 100);console.log(empty); // []console.log(arr); // [100, 1, 10, 30, 5]
Как отвечать на собеседовании
Начни с чёткого определения: splice мутирует массив и возвращает массив удалённых элементов. Подчеркни разницу с slice. Приведи пример использования и объясни, когда мутация оправдана, а когда лучше использовать иммутабельные методы. Упомяни, что возвращаемое значение - всегда массив, даже если ничего не удалено. Если уровень senior, добавь про производительность: splice требует O(n) из-за сдвига элементов, и для больших массивов это может быть проблемой.
Что проверяет интервьюер
- Понимание мутации vs иммутабельности в JavaScript.
- Знание разницы между
spliceиslice. - Умение правильно интерпретировать возвращаемое значение.
- Осознание последствий мутации для ссылочных типов и управления состоянием.
- Для senior - понимание производительности и альтернатив.
Типичные ошибки
- Путают
spliceсslice: думают, чтоspliceне мутирует или возвращает новый массив с изменениями. - Считают, что
spliceвозвращает изменённый массив (а не удалённые элементы). - Используют
spliceв иммутабельных контекстах (например, в Redux reducers), вызывая побочные эффекты. - Забывают, что
spliceизменяет длину массива, что может ломать циклы, идущие по индексам. - Не учитывают, что
spliceс отрицательнымstartотсчитывает с конца, а не с начала.
> Похожие задачи по frontend
В каком порядке сработают обработчики при клике на кнопку в DOM с вложенностью div, form, button
Как три фазы событий в JavaScript помогают управлять обработчиками
Какие механизмы в JavaScript позволяют писать отзывчивые пользовательские приложения
Всегда ли замыкание в JavaScript хранит один и тот же экземпляр внешних данных
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью