← 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.
Strg+Enter führt die Tests aus. Tab rückt ein; um den Editor per Tastatur zu verlassen, drücke Esc und dann Tab. Der Code wird in diesem Browser gespeichert.
Tests (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);