JavaScript-এ Shallow Copy বনাম Deep Copy
ডেটা টাইপের ওপর ভিত্তি করে JavaScript দুইভাবে কপি করার কাজ সম্পন্ন করে।
Primitive Values (Copy by Value)
Primitive টাইপগুলোর মধ্যে রয়েছে strings, numbers, booleans, symbols, bigInt, এবং null। যখন আপনি একটি primitive কপি করেন, JavaScript মেমরিতে একটি নতুন স্বতন্ত্র সংস্করণ তৈরি করে।
Example:
let a = 10;
let b = a;
b = 20;
ফলাফল: a এর মান ১০-ই থাকে।
Non-Primitive Values (Copy by Reference)
Objects এবং arrays ভিন্নভাবে কাজ করে। এগুলো reference ব্যবহার করে। যখন আপনি একটি object কপি করেন, আপনি আসলে মেমরিতে তার অবস্থানের একটি pointer কপি করেন।
Example:
let original = { name: "YOO" };
let copy = original;
copy.name = "NEW";
ফলাফল: original.name এখন "NEW" হয়ে গেছে।
পার্থক্য: Shallow বনাম Deep
একটি shallow copy একটি object-এর শুধুমাত্র উপরের স্তরটি (top level) কপি করে। যদি object-টির ভেতরে আরও nested object থাকে, তবে সেটি মূল nested reference-এর দিকেই নির্দেশ করে। একটি 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-র ফাঁদ।
Deep Copy পদ্ধতি
1. structuredClone()
এটি আধুনিক ব্রাউজার এবং Node.js-এ একটি বিল্ট-ইন ফাংশন। এটি nested structure-গুলোকে নিখুঁতভাবে হ্যান্ডেল করতে পারে।
সুবিধা:
- দ্রুত এবং native।
- Dates, RegExp, এবং Maps হ্যান্ডেল করতে পারে।
অসুবিধা:
- যদি object-টির মধ্যে functions বা DOM nodes থাকে, তবে এটি কাজ করবে না।
2. JSON.parse(JSON.stringify())
এটি একটি পুরনো কৌশল যেখানে আপনি একটি object-কে string-এ রূপান্তর করেন এবং পরে আবার object-এ ফিরিয়ে আনেন।
কেন এটি এড়িয়ে চলবেন:
- এটি
undefined,Map,Set, বাInfinity-এর মতো ডেটা হারিয়ে ফেলে। - এটি কিছু নির্দিষ্ট মানকে নষ্ট (corrupt) করে দিতে পারে।
Source: https://dev.to/yogesh_992/shallow-copy-vs-deep-copy-in-java-script-explained-in-easiest-way-3dg5
