JavaScript ऑब्जेक्ट क्लोनिंग
क्लोनिंग = ऑब्जेक्ट की प्रॉपर्टीज को नए ऑब्जेक्ट में कॉपी करना ताकि दोनों स्वतंत्र हों। शैलो कॉपी (केवल पहली लेवल) vs डीप कॉपी (नेस्टेड ऑब्जेक्ट्स भी)।
तरीका 1: लूप से मैन्युअल कॉपी (शैलो)
<html> <body> <p id="demo"></p> <script>
const source = {name: "सलमान", age: 23, salary: 25000};
let target = {};
for (let key in source) {
if (source.hasOwnProperty(key)) {
target[key] = source[key];
}
}
document.getElementById("demo").innerHTML =
"targetObject name = " + target.name + ", age = " + target.age + ", salary = " + target.salary;
</script> </body> </html>
आउटपुट
targetObject name = सलमान, age = 23, salary = 25000
तरीका 2: JSON.parse/stringify (डीप कॉपी)
<html> <body> <p id="demo"></p> <script>
const source = {name: "सलमान", age: 23, salary: 25000};
let target = JSON.parse(JSON.stringify(source));
document.getElementById("demo").innerHTML =
"targetObject name = " + target.name + ", age = " + target.age + ", salary = " + target.salary;
</script> </body> </html>
आउटपुट
targetObject name = सलमान, age = 23, salary = 25000
तरीका 3: Object.assign() (शैलो)
<html> <body> <p id="demo"></p> <script>
const source = {name: "सलमान", age: 23, salary: 25000};
let target = Object.assign({}, source);
document.getElementById("demo").innerHTML =
"targetObject name = " + target.name + ", age = " + target.age + ", salary = " + target.salary;
</script> </body> </html>
आउटपुट
targetObject name = सलमान, age = 23, salary = 25000
तरीका 4: स्प्रेड ऑपरेटर (ES2018, शैलो)
<script>
const source = {name: "सलमान", age: 23, salary: 25000};
const target = {...source};
// {name: "सलमान", age: 23, salary: 25000}
</script>
शैलो vs डीप कॉपी तुलना
| तरीका | टाइप | नेस्टेड ऑब्जेक्ट्स | फंक्शन्स | Date/RegExp | सर्कुलर रेफ |
|---|---|---|---|---|---|
| लूप / Object.assign / स्प्रेड | शैलो | रेफरेंस कॉपी | कॉपी होता है | कॉपी होता है | ❌ स्टैक ओवरफ्लो |
| JSON parse/stringify | डीप | ✅ डीप कॉपी | ❌ खो जाता है | ❌ स्ट्रिंग बन जाता है | ❌ एरर |
| structuredClone() | डीप | ✅ डीप कॉपी | ❌ खो जाता है | ✅ संरक्षित | ✅ सपोर्टेड |
| lodash.cloneDeep | डीप | ✅ डीप कॉपी | ✅ कॉपी | ✅ संरक्षित | ✅ सपोर्टेड |
आधुनिक सर्वोत्तम: structuredClone() (2022+)
<script>
const original = {
name: "टेस्ट",
date: new Date(),
regex: /abc/,
nested: {value: 42},
self: null
};
original.self = original; // सर्कुलर रेफरेंस
// ब्राउज़र/Node 17+ में उपलब्ध
const cloned = structuredClone(original);
console.log(cloned.date instanceof Date); // true
console.log(cloned.nested === original.nested); // false (डीप कॉपी)
</script>
सिफारिश
- सरल फ्लैट ऑब्जेक्ट्स:
{...obj}याObject.assign({}, obj) - नेस्टेड डेटा (नो फंक्शन्स/डेट/रेजेक्स):
JSON.parse(JSON.stringify(obj)) - जटिल डेटा (सर्कुलर, डेट, रेजेक्स):
structuredClone()या लाइब्रेरी (Lodash)