JavaScript में Shallow Copy बनाम Deep Copy

डेटा टाइप के आधार पर JavaScript कॉपी करने के दो तरीके अपनाता है।

प्रिमिटिव वैल्यूज़ (Primitive Values) (वैल्यू द्वारा कॉपी)

प्रिमिटिव टाइप्स में strings, numbers, booleans, symbols, bigInt, और null शामिल हैं। जब आप किसी प्रिमिटिव को कॉपी करते हैं, तो JavaScript मेमोरी में एक नया स्वतंत्र वर्शन बनाता है।

उदाहरण: let a = 10; let b = a; b = 20; परिणाम: a अभी भी 10 रहता है।

नॉन-प्रिमिटिव वैल्यूज़ (Non-Primitive Values) (रेफरेंस द्वारा कॉपी)

Objects और arrays अलग तरह से काम करते हैं। वे references का उपयोग करते हैं। जब आप किसी object को कॉपी करते हैं, तो आप केवल मेमोरी में उसके स्थान (location) के पॉइंटर को कॉपी करते हैं।

उदाहरण: let original = { name: "YOO" }; let copy = original; copy.name = "NEW"; परिणाम: original.name अब "NEW" है।

अंतर: Shallow बनाम Deep

एक shallow copy किसी object के टॉप लेवल को कॉपी करती है। यदि object में nested objects हैं, तो यह अभी भी मूल (original) nested references की ओर ही इशारा करती है। एक deep copy सभी नई वैल्यूज़ के साथ पूरी तरह से एक नया object बनाती है।

इसे पिज्जा के उदाहरण से समझें:

  • Shallow Copy: आप और आपका दोस्त एक ही पिज्जा साझा करते हैं। यदि आपका दोस्त एक स्लाइस खाता है, तो आपके लिए भी पिज्जा छोटा हो जाता है।
  • Deep Copy: आप दोनों के पास अपने अलग-अलग पिज्जा हैं। यदि आपका दोस्त एक स्लाइस खाता है, तो आपका पिज्जा वैसा ही रहता है।

Shallow Copy मेथड

आप shallow copy बनाने के लिए spread operator (...) का उपयोग कर सकते हैं।

let original = { name: "YOO", details: { age: 22 } }; let copy = { ...original };

चेतावनी: यदि आप original.details.age बदलते हैं, तो copy.details.age भी बदल जाता है। यह shallow copy का जाल (trap) है।

Deep Copy मेथड्स

1. structuredClone()

यह आधुनिक ब्राउज़र्स और Node.js में एक built-in function है। यह nested structures को पूरी तरह से संभालता है।

फायदे (Pros):

  • तेज़ और नेटिव (native) है।
  • Dates, RegExp, और Maps को संभालता है।

नुकसान (Cons):

  • यदि object में functions या DOM nodes हैं, तो यह विफल हो जाता है।

2. JSON.parse(JSON.stringify())

यह एक पुराना तरीका है जहाँ आप एक object को string में बदलते हैं और फिर वापस object में।

इससे क्यों बचें:

  • यह undefined, Map, Set, या Infinity जैसे डेटा को खो देता है।
  • यह कुछ वैल्यूज़ को खराब (corrupt) कर सकता है।

स्रोत: https://dev.to/yogesh_992/shallow-copy-vs-deep-copy-in-java-script-explained-in-easiest-way-3dg5