Deep vs Shallow Copy: JSON.parse और stringify के आम फंदे

2025-03-19

मूल ऑब्जेक्ट को बदले बिना कॉपी पर काम करना आसान लगता है, इसलिए JSON राउंडट्रिप का उपयोग बहुत होता है। लेकिन यह केवल साधारण JSON डेटा तक सुरक्षित है।

Shallow बनाम Deep Copy

Spread और Object.assign सिर्फ पहली परत कॉपी करते हैं, nested ऑब्जेक्ट साझा ही रहते हैं।

JSON राउंडट्रिप केवल JSON-serializable मानों को सुरक्षित रखता है।

क्या खो जाता है?

undefined, function और Symbol keys हट जाते हैं; Date स्ट्रिंग में बदल जाती है।

Map, Set, RegExp सही रूप में नहीं बचते; NaN/Infinity भी समस्या पैदा करते हैं।

const o = { d: new Date(), fn: () => 1, u: undefined };
JSON.parse(JSON.stringify(o)); // { d: "2026-06-10T..." }

Circular reference पर error

obj.self = obj होने पर Converting circular structure to JSON मिलता है।

ग्राफ जैसी संरचना के लिए structuredClone या WeakMap आधारित ट्रैवर्सल बेहतर है।

structuredClone कब बेहतर

आधुनिक ब्राउजर और Node 17+ में यह Date, Map, Set और cycles संभाल लेता है।

फंक्शन, DOM nodes और custom prototype behavior फिर भी संरक्षित नहीं रहता।

सही विकल्प कैसे चुनें

साधारण API/config JSON के लिए JSON राउंडट्रिप हल्का और उपयोगी है।

Rich types या cycles हों तो structuredClone, और जटिल class graphs में cloneDeep बेहतर रहता है।