← 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.
Ctrl+Enter uruchamia testy. Tab robi wcięcie; aby wyjść z edytora klawiaturą, naciśnij Esc, a potem Tab. Kod zapisuje się w tej przeglądarce.
Testy (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);