Q28. What is the difference between shallow copy and deep copy of objects?
Shallow copy কেন যথেষ্ট নয়, deep copy-এর সঠিক উপায় এবং কোনটা কখন দরকার।
Shallow copy মানে শুধু বাইরের স্তরের প্রপার্টি কপি হয় — ভেতরের nested object বা array-এর রেফারেন্স একই থাকে। আর deep copy মানে সব স্তর ধরে স্বতন্ত্র কপি তৈরি হয়।
const original = {
name: "Rahim",
address: { city: "Dhaka" },
};
// shallow copy
const shallow = { ...original };
shallow.address.city = "Sylhet";
console.log(original.address.city); // "Sylhet" — মূলও বদলে গেছে!ধাপে ধাপে — ... দিয়ে বাইরের name আর address দুটোই একটা নতুন object-এ বসেছে। কিন্তু address একটি object, তাই সেটার রেফারেন্স কপি হয় — দুই object-ই এখন একই address-এর দিকে তাকাচ্ছে। তাই এক জায়গায় বদলালে অন্যটাও বদলে যায়।
Deep copy-তে nested object-ও আলাদা হয়, তাই কোনো একটি বদলালেও অন্যটি অক্ষত থাকে।
const original = {
name: "Rahim",
address: { city: "Dhaka" },
};
// deep copy — আধুনিক ও সবচেয়ে নির্ভরযোগ্য উপায়
const deep = structuredClone(original);
deep.address.city = "Sylhet";
console.log(original.address.city); // "Dhaka" — অক্ষত
console.log(deep.address.city); // "Sylhet"JSON.parse(JSON.stringify(obj)) দিয়েও deep copy হয়, কিন্তু সেখানে Date সরে যায়, undefined ও function হারিয়ে যায়, আর Map বা Set ভুলভাবে বদলে যায়। তাই structuredClone ভালো।
// nested array-ও
const list = [{ name: "Rahim" }, { name: "Karim" }];
// shallow — ভুল
const bad = [...list];
bad[0].name = "Jamal";
console.log(list[0].name); // "Jamal" — মূল বদলে গেছে
// deep — ঠিক
const good = structuredClone(list);
good[0].name = "Jamal";
console.log(list[0].name); // "Rahim"// array-এর জন্য shallow copy
const shallowArr = list.slice();
const spreadArr = [...list];
// যখন শুধু এক স্তরের element-ই বদলাতে হবে, তখন shallow যথেষ্ট
const shallow = [...list];
shallow.push({ name: "Jamal" }); // push মূলকে ছোঁয় না| পদ্ধতি | গভীরতা | Date / Map / Set |
|---|---|---|
{ ...obj } | shallow | ঠিক থাকে |
Object.assign({}, obj) | shallow | ঠিক থাকে |
structuredClone(obj) | deep | ঠিক থাকে |
JSON.parse(JSON.stringify(obj)) | deep | নষ্ট হয় |
| ফাংশন দিয়ে হাতে কপি | deep | নিজের মতো ঠিক করতে হয় |
State update করতে গিয়ে ...obj ব্যবহার করলে মূল object বদলানোর ঝুঁকি থাকে। তাই নিশ্চিত হতে পারলে structuredClone ব্যবহার করুন, বা library-র immutable update helper নিন।