Есть несколько способов сделать копию массива в JavaScript:
[...arr] — самый современный способ 🆕arr.slice() — классический способ 📚arr.concat() — ещё один способ 🔗Array.from(arr) — универсальный способ 🌐const original = [1, 2, 3];
// Spread — самый частый способ
const copy1 = [...original]; // [1, 2, 3]
// slice — классический способ
const copy2 = original.slice(); // [1, 2, 3]
// Важно: это поверхностная копия!Сделать копию массива — как сфотографировать коробку с вещами. У тебя появляется новая коробка с такими же вещами, но это отдельная коробка! 📦📸
Копирует только “поверхность” массива. Если в массиве были объекты, то копируются ссылки на них, а не сами объекты:
const fruits = ['яблоко', 'банан', {name: 'апельсин'}];
// Копируем массив
const copy = [...fruits];
// Меняем в копии
copy[0] = 'груша';
console.log(fruits[0]); // 'яблоко' — оригинал не меняется
console.log(copy[0]); // 'груша' — копия изменилась
// Но объекты — одни и те же!
copy[2].name = 'мандарин';
console.log(fruits[2].name); // 'мандарин' — объект общий!const arr = [1, 2, 3];
// Пустой slice — копирует весь массив
const copy = arr.slice();
// То же самое, что и [...arr]const original = [1, 2, 3];
// concat без параметров
const copy1 = original.concat();
// Array.from
const copy2 = Array.from(original);
// Все делают одно и то же — поверхностную копиюКопирует всё, включая вложенные объекты. Каждый объект становится новым:
const arr = [1, {name: 'Иван'}, [2, 3]];
// Глубокая копия через JSON
const deepCopy = JSON.parse(JSON.stringify(arr));
// Теперь объекты разные
deepCopy[1].name = 'Петр';
console.log(arr[1].name); // 'Иван' — оригинал не меняется⚠️ Важно: JSON способ не работает с функциями, undefined, Symbol и другими специальными значениями!
// ✅ Для массивов с простыми значениями
const numbers = [1, 2, 3];
const copy = [...numbers];// ✅ Для массивов с объектами, если нужно полное отделение
const complex = [{user: 'Иван'}, {user: 'Петр'}];
const deep = JSON.parse(JSON.stringify(complex));// ❌ Ошибка — это не копия, а ссылка!
const arr1 = [1, 2, 3];
const arr2 = arr1; // Не копия, а ссылка на тот же массив!
arr2[0] = 999;
console.log(arr1[0]); // 999 — оригинал изменился!
// ✅ Правильно — сделать настоящую копию
const arr3 = [...arr1]; // Настоящая копия
arr3[0] = 888;
console.log(arr1[0]); // 999 — оригинал не меняется// ❌ Ошибка — JSON не подходит для всех данных
const arr = [function() {}, undefined, Symbol('id')];
// JSON.stringify(arr); // Плохо работает!
// ✅ Правильно — использовать специальные библиотеки
// или писать свою функцию глубокого копирования[...arr] — современный способ поверхностной копии 🆕Понимание разницы между копированием и ссылкой помогает избежать ошибок в программах! 💪
Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪