← Усі задачіJavaScript · Senior

deepClone: глибока копія

Напишіть функцію deepClone(value), яка робить глибоку копію: об'єкти, масиви, Date, Map і Set будь-якої вкладеності. Примітиви й функції повертаються як є.

Копія має витримувати циклічні посилання (obj.self = obj) і зберігати спільні посилання: якщо два поля вказували на один об'єкт, у копії вони теж вказують на одну копію. Розв'яжіть без structuredClone.

Тести (7)

  1. 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);
  2. 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);
  3. 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);
  4. const src = { name: 'root' };
    src.self = src;
    const copy = deepClone(src);
    expect(copy.self).toBe(copy);
    expect(copy === src).toBe(false);
  5. const shared = { x: 1 };
    const copy = deepClone({ a: shared, b: shared });
    expect(copy.a).toBe(copy.b);
    expect(copy.a === shared).toBe(false);
  6. expect(deepClone(5)).toBe(5);
    expect(deepClone(null)).toBe(null);
    expect(deepClone('x')).toBe('x');
  7. const f = () => 1;
    expect(deepClone({ f }).f).toBe(f);