> Почему метод 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, который возвращает копию части массива без мутации.

Пример кода

JAVASCRIPT
const arr = [1, 2, 3, 4, 5];
// Удаление 2 элементов, начиная с индекса 1
const 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]
// Отрицательный start
arr.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 отсчитывает с конца, а не с начала.

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

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