Q29. What are WeakMap and WeakSet, and when would you use them?
WeakMap ও WeakSet কীভাবে Map ও Set থেকে আলাদা, এবং private data লুকানোর বাস্তব কাজ।
WeakMap আর WeakSet হলো Map ও Set-এর মতো collection, কিন্তু পার্থক্য হলো এগুলো weak reference রাখে — মানে collection থেকে reference সরালে সেই object-ও garbage collector উড়িয়ে ফেলতে পারে, মেমরি ফাঁকা হয়ে যায়।
// সাধারণ Map — object কখনো মুছে ফেলা হয় না
const map = new Map();
map.set({ id: 1 }, "data");
// WeakMap-এ key শুধু object বা symbol হতে পারে
const weakMap = new WeakMap();
weakMap.set({ id: 1 }, "data");
weakMap.set("text", "error"); // TypeError — string key দেওয়া যায় নাআরেকটি পার্থক্য — WeakMap ও WeakSet ঘুরে দেখা যায় না (size, forEach, iterator নেই), এবং key সবসময় weak থাকে, মান strong থাকে।
const user = { name: "Rahim" };
const wm = new WeakMap();
wm.set(user, { role: "admin" });
console.log(wm.get(user).role); // "admin"
// wm.size নেই
// for...of দিয়ে ঘোরা যায় না — অনিচ্ছাকৃতভাবে মুছে যায় বলেসবচেয়ে জনপ্রিয় কাজ হলো object-এর সাথে private data জুড়ে দেওয়া — যাতে সেটা পুরোপুরি লুকানো থাকে, কিন্তু object নষ্ট হলে ডেটাও নষ্ট হয়ে যায়।
const data = new WeakMap();
class User {
constructor(name, password) {
this.name = name; // সবাই দেখতে পারে
data.set(this, { password }); // কেউ দেখতে পারে না
}
check(password) {
return data.get(this).password === password;
}
}
const user = new User("Rahim", "secret123");
console.log(user.name); // "Rahim"
console.log(user.password); // undefined
console.log(user.check("secret123")); // trueWeakSet-এর ব্যবহারও একই ধরনের — কোনো object অবস্থায় আছে কি না তা ট্র্যাক করা, যেমন একটি element ইতিমধ্যে দেখানো হয়েছে কি না।
const visited = new WeakSet();
function track(node) {
if (visited.has(node)) return false; // আগেই এসেছে
visited.add(node);
return true;
}
const a = { name: "A" };
console.log(track(a)); // true
console.log(track(a)); // falseMemoization বানানোর জন্যও WeakMap খুব উপযুক্ত — কারণ key হিসাব হয়ে গেলে object মুছে গেলে cache-ও মুছে যায়, মেমরি ফাঁকা হয়ে যায় না।
| বিষয় | Map / Set | WeakMap / WeakSet |
|---|---|---|
| key হতে পারে | যেকোনো ধরনের মান | শুধু object বা symbol |
| key iterate করা | যায় | যায় না |
size আছে | হ্যাঁ | নেই |
| reference | strong | weak |
| কোনোদিন খালি হয় | না | হতে পারে |
WeakMap বা WeakSet শুধু object key রাখে — primitive বা WeakRef দরকার হলে Map ব্যবহার করুন। আর private data লুকানোর ক্ষেত্রে #privateField syntax এখন আরও পরিষ্কার উপায়।