← Wszystkie zadaniaJavaScript · Senior

deepClone: głęboka kopia

Napisz funkcję deepClone(value), która robi głęboką kopię obiektów, tablic, Date, Map i Set o dowolnym zagnieżdżeniu. Prymitywy i funkcje zwracamy bez zmian.

Kopia musi radzić sobie z referencjami cyklicznymi (obj.self = obj) i zachowywać wspólne referencje: jeśli dwa pola wskazywały na jeden obiekt, w kopii też wskazują na jedną kopię. Rozwiąż bez structuredClone.

Testy (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);