Коротка відповідь
middleКопіювання простого об’єкта можна виконати за допомогою spread‑оператора, Object.assign або JSON.stringify/parse. Усі ці методи створюють поверхневу копію, що підходить для об’єктів без вкладених структур.
Повне пояснення
Що це і навіщо
Копіювання об’єкта потрібне, коли треба змінювати дані без мутації оригіналу – важливо для реактивності, Redux‑store чи простих утиліт.
Принцип роботи / алгоритм
- Spread (
{...obj}) розпаковує власні enumerable‑property‑keys у новий об’єкт. - Object.assign копіює властивості з джерела в цільовий об’єкт.
- JSON.stringify/parse перетворює об’єкт у рядок і назад, що видаляє посилання.
Реалізація (JS / TS)
const shallowCopy1 = {...obj};
const shallowCopy2 = Object.assign({}, obj);
const deepCopy = JSON.parse(JSON.stringify(obj));
Тестування
test('spread copies', () => {
const copy = {...obj};
expect(copy).toEqual(obj);
expect(copy).not.toBe(obj);
});
Проблеми та edge cases
- Вкладені об’єкти – spread/assign роблять поверхневу копію; внутрішні посилання залишаються спільними.
- Функції, Symbol, Date – JSON‑метод їх втрачає; spread/assign копіюють як звичайні значення.
- Кілька джерел – Object.assign приймає багато аргументів, останній перезаписує.
- Порядок властивостей – spread зберігає порядок, Object.assign також.
- Копіювання глибоких структур – треба рекурсивно копіювати або використовувати бібліотеки (lodash.cloneDeep).
Оптимізація та продуктивність
Spread і Object.assign працюють швидко для малій кількості властивостей; JSON‑метод повільніший і не підходить для великих об’єктів.
Без JS / архітектурні альтернативи
У чистому HTML/CSS немає прямого аналогу копіювання об’єктів; можна використовувати шаблони (Handlebars, Mustache) або Web Components для повторного використання структури.
Cheatsheet + follow-up
- Spread:
{...obj}– швидко, поверхнево. - Object.assign:
Object.assign({}, obj)– той же результат, але з можливістю багатьох джерел. - JSON:
JSON.parse(JSON.stringify(obj))– глибока копія, але з обмеженнями.
Потенційні питання на інтерв’ю:
- Як копіювати об’єкт з Date‑полями без втрати типу?
- Які недоліки JSON‑копіювання для функцій і Symbol?