WeakMap

🔹 WeakMap چیست؟

WeakMap خیلی شبیه Map هست، ولی چند تفاوت کلیدی داره:

  1. کلیدها فقط می‌تونن Object باشن (نه string، نه number و نه primitive دیگه).

  2. مراجع ضعیف (Weak References): اگه شیء به هیچ متغیر دیگه‌ای وصل نباشه، توسط Garbage Collector حذف می‌شه حتی اگه توی WeakMap باشه.

  3. قابل iteration (پیمایش) نیست → یعنی forEach, keys, values, entries نداره.

🔹 ایجاد یک WeakMap

const wm = new WeakMap(); let obj = {}; wm.set(obj, "some value"); console.log(wm.get(obj)); // "some value"

🔹 متدهای WeakMap

متدتوضیح
set(key, value)اضافه کردن جفت کلید-مقدار (کلید باید object باشه).
get(key)گرفتن مقدار بر اساس کلید.
has(key)بررسی وجود کلید.
delete(key)حذف کلید.

مثال:

const wm = new WeakMap(); let user = { id: 1 }; wm.set(user, "User Data"); console.log(wm.has(user)); // true console.log(wm.get(user)); // "User Data" wm.delete(user); console.log(wm.has(user)); // false

🔹 Garbage Collection در WeakMap

چون WeakMap کلیدها رو ضعیف نگه می‌داره، اگه هیچ متغیری به اون object اشاره نکنه، خودکار پاک می‌شه.

let person = { name: "Ali" }; const wm = new WeakMap(); wm.set(person, "secret info"); console.log(wm.get(person)); // "secret info" // حالا دیگه هیچ متغیری به person اشاره نمی‌کنه person = null; // بعد از مدتی، Garbage Collector شیء رو حذف می‌کنه // و WeakMap هم کلیدش رو از دست می‌ده

🔹 کاربردهای واقعی WeakMap

  1. ذخیره داده خصوصی برای اشیاء
    می‌تونیم داده‌هایی نگه داریم که مستقیم روی شیء قرار نگیرن.

    const privateData = new WeakMap(); class User { constructor(name) { privateData.set(this, { name }); } getName() { return privateData.get(this).name; } } const u1 = new User("Sara"); console.log(u1.getName()); // "Sara"
  2. مدیریت Cache (مثلاً نتایج محاسبات روی یک object)

    const cache = new WeakMap(); function heavyCalculation(obj) { if (!cache.has(obj)) { let result = obj.num * 2; cache.set(obj, result); } return cache.get(obj); } let data = { num: 10 }; console.log(heavyCalculation(data)); // 20 console.log(heavyCalculation(data)); // 20 (از cache)

🎯 تمرین در HTML

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>JavaScript WeakMap</title> </head> <body> <h2>WeakMap Example</h2> <pre id="output"></pre> <script> const output = document.getElementById("output"); const wm = new WeakMap(); let user = { id: 101, name: "Ali" }; wm.set(user, "Sensitive Data"); output.innerText += "Has user? " + wm.has(user) + "\n"; output.innerText += "Get user: " + wm.get(user) + "\n"; wm.delete(user); output.innerText += "After delete, has user? " + wm.has(user) + "\n"; </script> </body> </html>

📌 جمع‌بندی

  • WeakMap شبیه Map هست ولی:

    • کلیدها فقط object هستن.

    • قابل پیمایش (iteration) نیست.

    • برای مدیریت داده‌های خصوصی یا cache خیلی مفید هست.

    • به خاطر Weak References باعث می‌شه Garbage Collector راحت‌تر حافظه رو آزاد کنه.