Deep vs. Shallow Copy: Die Fallstricke von JSON.parse und stringify
2025-03-19
Wer ein Objekt mutierbar kopieren will, greift oft zum JSON-Roundtrip. Fuer reine JSON-Daten ist das okay - bei Date, Funktionen und Zyklen wird es schnell problematisch.
Shallow vs. Deep Copy
Spread und Object.assign kopieren nur Ebene eins; verschachtelte Objekte bleiben geteilt.
Der JSON-Roundtrip erhaelt nur JSON-serialisierbare Werte.
Was geht verloren?
undefined, Funktionen und Symbol-Keys verschwinden; Date wird zu String.
Map, Set und RegExp werden entwertet; NaN/Infinity brechen oder werden null.
const o = { d: new Date(), fn: () => 1, u: undefined };
JSON.parse(JSON.stringify(o)); // { d: "2026-06-10T..." }Zyklische Referenzen
obj.self = obj fuehrt zu Converting circular structure to JSON.
Fuer Objektgraphen besser structuredClone oder eine WeakMap-basierte Traversierung nutzen.
Wann structuredClone gewinnt
In modernen Browsern und Node 17+ verfuegbar; erhaelt Date, Map, Set, RegExp und Zyklen.
Funktionen, DOM-Knoten und Prototyp-Methoden bleiben ausgeschlossen.
Strategie waehlen
Fuer reine API-/Config-JSON ist JSON-Roundtrip oft die leichteste Loesung.
Bei Dates, Maps oder Zyklen: structuredClone; bei komplexen Klassenstrukturen: lodash.cloneDeep.