← Alle AufgabenJavaScript · Senior

deepClone: tiefe Kopie

Schreib eine Funktion deepClone(value), die eine tiefe Kopie von Objekten, Arrays, Date, Map und Set in beliebiger Tiefe macht. Primitive und Funktionen werden unverändert zurückgegeben.

Die Kopie muss zirkuläre Referenzen überstehen (obj.self = obj) und geteilte Referenzen bewahren: zeigten zwei Felder auf ein Objekt, zeigen sie in der Kopie ebenfalls auf eine Kopie. Löse es ohne structuredClone.

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