Learn JavaScript

slice() - метод для копирования части массива в JavaScript

slice() возвращает часть массива в виде нового массива.

Это один из самых удобных методов, когда нужно взять кусок массива и не менять исходный.

Синтаксис

array.slice()
array.slice(start)
array.slice(start, end)

start - индекс, с которого начинается копирование.

end - индекс, до которого копируются элементы, но сам end в результат не входит.

Что делает slice()

Метод создаёт новый массив и копирует в него нужные элементы.

const numbers = [10, 20, 30, 40];
const result = numbers.slice(1, 3);

console.log(result);  // [20, 30]
console.log(numbers); // [10, 20, 30, 40]

Исходный массив при этом не меняется.

start и end

Первый аргумент задаёт начало, второй - конец диапазона.

const fruits = ["apple", "banana", "orange", "kiwi"];

console.log(fruits.slice(1, 3)); // ["banana", "orange"]

Здесь копирование начинается с индекса 1 и останавливается перед индексом 3.

Если передать только start

Если указать только start, метод возьмёт элементы от этой позиции до конца массива.

const numbers = [1, 2, 3, 4];

console.log(numbers.slice(2)); // [3, 4]

Если не передавать аргументы

Без аргументов slice() возвращает копию массива.

const numbers = [1, 2, 3];
const copy = numbers.slice();

console.log(copy);    // [1, 2, 3]
console.log(copy === numbers); // false

Это простой способ скопировать массив.

Отрицательные индексы

slice() поддерживает отрицательные индексы.

В этом случае отсчёт идёт с конца массива.

const numbers = [1, 2, 3, 4, 5];

console.log(numbers.slice(-2));    // [4, 5]
console.log(numbers.slice(1, -1)); // [2, 3, 4]

Это одна из причин, почему slice() часто удобнее других методов.

slice() не меняет исходный массив

После вызова slice() исходный массив остаётся прежним:

const items = ["a", "b", "c"];
const result = items.slice(0, 2);

console.log(items);  // ["a", "b", "c"]
console.log(result); // ["a", "b"]

Если нужен именно изменённый массив, обычно смотрят в сторону splice().

slice() и splice()

Эти методы часто путают, но у них разная задача.

const numbers = [1, 2, 3, 4];
const result = numbers.slice(1, 3);

console.log(result);  // [2, 3]
console.log(numbers); // [1, 2, 3, 4]

slice() возвращает новый массив и не меняет исходный.

splice() меняет исходный массив и может удалять, вставлять или заменять элементы.

Поверхностная копия

slice() создаёт не глубокую, а поверхностную копию.

Это значит, что вложенные объекты внутри массива не копируются полностью.

const users = [{ name: "Anna" }];
const copy = users.slice();

copy[0].name = "Ivan";

console.log(users[0].name); // "Ivan"

Сам массив новый, но вложенный объект внутри него остался тем же самым.

Когда это полезно

slice() удобно использовать, когда:

  • нужно получить часть массива
  • нужно скопировать массив
  • важно не менять исходные данные
  • нужно взять несколько последних элементов через отрицательный индекс

Частые ошибки

Думать, что end включается в результат

const numbers = [1, 2, 3, 4];

console.log(numbers.slice(1, 3)); // [2, 3]

Элемент с индексом 3 сюда уже не попадёт.

Путать slice() и splice()

const numbers = [1, 2, 3, 4];

numbers.slice(1, 3);

Этот код не меняет массив. Если ожидалось удаление элементов, нужен не slice().

Считать, что slice() делает глубокую копию

const list = [{ value: 1 }];
const copy = list.slice();

Массив копируется, но вложенные объекты внутри остаются общими.

Быстрая памятка

  • slice() возвращает часть массива в новом массиве
  • исходный массив не меняется
  • end не включается в результат
  • метод поддерживает отрицательные индексы
  • без аргументов slice() создаёт копию массива

Коротко

slice() - это удобный способ взять часть массива или сделать его копию без изменения исходных данных. Главное, что стоит запомнить: метод возвращает новый массив, а не меняет старый.