Copie profonde vs superficielle : pieges de JSON.parse et stringify
2025-03-19
Pour modifier une copie sans toucher l'original, le round-trip JSON marche sur des donnees simples. Mais avec Date, fonctions ou cycles, les limites apparaissent vite.
Copie superficielle vs profonde
Spread et Object.assign ne copient que le premier niveau ; les objets imbriques restent partages.
Le passage par JSON ne conserve que les valeurs serialisables JSON.
Ce qui se perd
undefined, fonctions et cles Symbol disparaissent ; Date devient une chaine ISO.
Map, Set et RegExp se degradent ; NaN et Infinity ne sont pas preserves correctement.
const o = { d: new Date(), fn: () => 1, u: undefined };
JSON.parse(JSON.stringify(o)); // { d: "2026-06-10T..." }Les references circulaires echouent
Si un objet se reference lui-meme, stringify leve Converting circular structure to JSON.
Pour des graphes, utilisez structuredClone ou un parcours avec WeakMap.
Quand structuredClone est meilleur
Dans les navigateurs modernes et Node 17+, il preserve Date, Map, Set, RegExp et les cycles.
Il ne clone toujours pas les fonctions, noeuds DOM ni methodes de prototype.
Comment choisir
Pour du JSON API simple, le round-trip JSON reste leger et pratique.
Avec dates, maps ou cycles, preferez structuredClone ; pour des graphes complexes, cloneDeep.