JavaScript मध्ये Shallow Copy विरुद्ध Deep Copy
डेटा प्रकारानुसार (data type) JavaScript कॉपी करण्याच्या दोन पद्धती वापरते.
प्रिमिटिव्ह व्हॅल्यूज (Primitive Values) (Copy by Value)
प्रिमिटिव्ह प्रकारांमध्ये strings, numbers, booleans, symbols, bigInt आणि null यांचा समावेश होतो. जेव्हा तुम्ही एखादी प्रिमिटिव्ह व्हॅल्यू कॉपी करता, तेव्हा JavaScript मेमरीमध्ये एक नवीन स्वतंत्र आवृत्ती (version) तयार करते.
उदाहरण:
let a = 10;
let b = a;
b = 20;
निकाल: a ची किंमत 10 च राहते.
नॉन-प्रिमिटिव्ह व्हॅल्यूज (Non-Primitive Values) (Copy by Reference)
Objects आणि arrays वेगळ्या पद्धतीने काम करतात. ते references वापरतात. जेव्हा तुम्ही एखादा object कॉपी करता, तेव्हा तुम्ही फक्त मेमरीमधील त्याच्या स्थानाचा (location) पॉइंटर कॉपी करता.
उदाहरण:
let original = { name: "YOO" };
let copy = original;
copy.name = "NEW";
निकाल: original.name आता "NEW" झाले आहे.
फरक: Shallow विरुद्ध Deep
Shallow copy मध्ये object चा फक्त वरचा स्तर (top level) कॉपी केला जातो. जर 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()
हे आधुनिक browsers आणि Node.js मधील एक built-in function आहे. हे nested structures उत्तम प्रकारे हाताळते.
फायदे:
- जलद आणि native आहे.
- Dates, RegExp, आणि Maps हाताळू शकते.
तोटे:
- जर 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
