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.