← Усі задачіJavaScript · Senior
deepClone: глибока копія
Напишіть функцію deepClone(value), яка робить глибоку копію: об'єкти, масиви, Date, Map і Set будь-якої вкладеності. Примітиви й функції повертаються як є.
Копія має витримувати циклічні посилання (obj.self = obj) і зберігати спільні посилання: якщо два поля вказували на один об'єкт, у копії вони теж вказують на одну копію. Розв'яжіть без structuredClone.
Ctrl+Enter - запустити тести. Tab - відступ; щоб вийти з редактора клавіатурою, натисніть Esc, а потім Tab. Код зберігається в цьому браузері.
Тести (7)
const src = { a: 1, nested: { b: [1, { c: 2 }] } }; const copy = deepClone(src); expect(copy).toEqual(src); expect(copy.nested === src.nested).toBe(false); expect(copy.nested.b[1] === src.nested.b[1]).toBe(false);
const date = new Date('2024-01-02T03:04:05Z'); const copy = deepClone({ date }); expect(copy.date).toBeInstanceOf(Date); expect(copy.date.getTime()).toBe(date.getTime()); expect(copy.date === date).toBe(false);
const src = { m: new Map([['k', { v: 1 }]]), s: new Set([1, 2]) }; const copy = deepClone(src); expect(copy).toEqual(src); expect(copy.m.get('k') === src.m.get('k')).toBe(false); expect(copy.s === src.s).toBe(false);
const src = { name: 'root' }; src.self = src; const copy = deepClone(src); expect(copy.self).toBe(copy); expect(copy === src).toBe(false);
const shared = { x: 1 }; const copy = deepClone({ a: shared, b: shared }); expect(copy.a).toBe(copy.b); expect(copy.a === shared).toBe(false);
expect(deepClone(5)).toBe(5); expect(deepClone(null)).toBe(null); expect(deepClone('x')).toBe('x');
const f = () => 1; expect(deepClone({ f }).f).toBe(f);