Справочник · JavaScript
Метод slice(): часть массива без изменений
Метод slice(start, end) возвращает новый массив с элементами от индекса start до end, не включая end. Исходный массив не меняется. Отрицательные индексы считаются с конца, поэтому arr.slice(-3) — три последних элемента, а arr.slice() без аргументов — поверхностная копия массива.
slice(1, 3)— элементы с индексами 1 и 2.- Исходный массив не меняется.
slice(-2)— два последних элемента.slice()— копия массива (поверхностная).- Вырезать с изменением массива —
splice.
Минимальный пример
const tasks = ['купить хлеб', 'позвонить', 'сделать ДЗ', 'погулять', 'прочитать'];
tasks.slice(0, 3); // ['купить хлеб', 'позвонить', 'сделать ДЗ']
tasks.slice(-2); // ['погулять', 'прочитать']
tasks.length; // 5 — исходный массив не изменилсяПервые три задачи для превью и две последние — без изменения исходного списка.
Аргументы start и end
| Вызов | Результат для [a, b, c, d, e] |
|---|---|
slice(2) | [c, d, e] — от 2 до конца |
slice(1, 4) | [b, c, d] — end не включается |
slice(-2) | [d, e] — два с конца |
slice(1, -1) | [b, c, d] — без первого и последнего |
slice(3, 1) | [] — start после end |
slice(10) | [] — start за пределами |
Удобно помнить: длина результата равна end - start для неотрицательных индексов внутри массива. Индексы за пределами не вызывают ошибку, они просто обрезаются по границам.
Копия массива
const original = [3, 1, 2];
const sorted = original.slice().sort((a, b) => a - b);
original; // [3, 1, 2] — не тронут
sorted; // [1, 2, 3]
// современные альтернативы
const copy = [...original];
const sorted2 = original.toSorted((a, b) => a - b);sort и reverse меняют исходный массив, поэтому перед ними часто делают копию через slice или spread. Новые методы toSorted и toReversed сразу возвращают копию.
Поверхностная копия
const users = [{ name: 'Аня' }, { name: 'Боря' }];
const copy = users.slice();
copy[0].name = 'Вика';
users[0].name; // 'Вика' — объект общийslice копирует сам массив, но объекты внутри остаются теми же. Для глубокой копии используй structuredClone(users).
Пагинация и «показать ещё»
const PAGE_SIZE = 10;
function getPage(items, page) {
const start = (page - 1) * PAGE_SIZE;
return items.slice(start, start + PAGE_SIZE);
}
getPage(products, 1); // товары 0–9
getPage(products, 3); // товары 20–29Классический приём для пагинации на клиенте и кнопки «Показать ещё»: items.slice(0, shown), где shown растёт на шаг при каждом клике.
slice у строк
'praktum.ru'.slice(0, 7); // 'praktum'
'report.pdf'.slice(-3); // 'pdf'У строк есть свой метод slice с той же логикой индексов. Он тоже возвращает новую строку. Подробнее — на странице slice для строк.
Один последний элемент: at()
const arr = [10, 20, 30];
arr.slice(-1); // [30] — массив
arr.at(-1); // 30 — элементslice всегда возвращает массив. Если нужен один элемент с конца, используй at(-1).
slice или splice
Возвращает копию части массива. Исходный не меняется. Второй аргумент — индекс конца.
Удаляет или вставляет элементы в исходный массив. Второй аргумент — количество.
Частые ошибки
- Ждут, что элемент с индексом end попадёт в результат.
- Путают slice и splice и случайно меняют исходный массив.
- Передают вторым аргументом количество элементов, как в splice.
- Считают slice глубокой копией массива объектов.
- Используют
slice(-1), когда нужен элемент, а не массив, — для этого at(-1).
Доступность
Если показываешь часть списка через slice и кнопку «Показать ещё», переноси фокус на первый новый элемент или объявляй количество через aria-live, чтобы пользователи клавиатуры и скринридеров поняли, что список вырос.
Поддержка браузерами
slice поддерживается всеми браузерами. at, toSorted и structuredClone — во всех актуальных браузерах.
Практика
Напиши функцию preview(list, n), которая возвращает строку из первых n элементов через запятую и добавляет «и ещё K», если элементов больше. Для ['HTML', 'CSS', 'JS', 'React'] и n = 2 — «HTML, CSS и ещё 2». Исходный массив не меняй.
Показать решение
function preview(list, n) {
const shown = list.slice(0, n).join(', ');
const rest = list.length - n;
return rest > 0 ? `${shown} и ещё ${rest}` : shown;
}
preview(['HTML', 'CSS', 'JS', 'React'], 2); // 'HTML, CSS и ещё 2'Частые вопросы
Меняет ли slice исходный массив?
Нет, slice возвращает новый массив, исходный остаётся прежним.
Включается ли end в результат?
Нет, элементы берутся до end, не включая его.
Как получить последние элементы массива?
arr.slice(-n) — последние n элементов.
Как скопировать массив?
arr.slice() или [...arr]. Это поверхностная копия.
Чем slice отличается от splice?
slice копирует часть без изменений, splice изменяет исходный массив.