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.