WeakSet

WeakSet یک نوع ساختار داده در جاوااسکریپت هست که فقط می‌تونه اشیاء (Objects) رو ذخیره کنه.
برخلاف Set که می‌تونه هر نوع داده‌ای رو نگه داره (اعداد، رشته‌ها، …)، در WeakSet فقط و فقط Object معتبره.

🔹 ایجاد یک WeakSet

const ws = new WeakSet(); const obj1 = {name: "Ali"}; const obj2 = {name: "Sara"}; ws.add(obj1); ws.add(obj2); console.log(ws); // WeakSet { <items hidden> }

📌 خروجی توی کنسول مستقیم نمایش داده نمی‌شه (آیتم‌ها hidden هستن) چون WeakSet برای مدیریت حافظه بهینه‌سازی شده.

🔹 ویژگی‌های WeakSet

  1. فقط Object رو قبول می‌کنه.

  2. عنصر primitive مثل number, string, boolean رو قبول نمی‌کنه.

    ws.add(123); // ❌ TypeError
  3. اعضای داخل WeakSet قابل enumeration نیستن → یعنی نمی‌شه پیمایش کرد (مثل for...of, forEach).

  4. عناصرش ضعیف (weak) هستن → اگر جایی دیگه رفرنسی به شیء وجود نداشته باشه، به طور خودکار توسط Garbage Collector پاک می‌شه.

🔹 متدهای WeakSet

  • add(value) → اضافه کردن یک شیء

  • delete(value) → حذف کردن یک شیء

  • has(value) → بررسی وجود شیء

🔸 مثال:

const ws = new WeakSet(); const objA = { id: 1 }; const objB = { id: 2 }; ws.add(objA); ws.add(objB); console.log(ws.has(objA)); // true console.log(ws.has({ id: 1 })); // false (چون رفرنس فرق می‌کنه) ws.delete(objB); console.log(ws.has(objB)); // false

📌 توجه کن → ws.has({ id: 1 }) نتیجه‌اش false شد چون اون آبجکت جدیدی هست و رفرنسی به objA نداره.

🔹 کاربردهای WeakSet

1️⃣ ذخیره داده خصوصی برای اشیاء

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

const visited = new WeakSet(); function visit(obj) { if (visited.has(obj)) { console.log("این شیء قبلاً بازدید شده!"); } else { visited.add(obj); console.log("اولین بازدید از این شیء"); } } const page1 = {}; const page2 = {}; visit(page1); // اولین بازدید visit(page1); // قبلاً بازدید شده! visit(page2); // اولین بازدید

2️⃣ مدیریت حافظه بهینه

از اونجایی که آبجکت‌های داخل WeakSet به صورت ضعیف نگه‌داری می‌شن، وقتی یه آبجکت دیگه جایی رفرنس نداشته باشه، به صورت خودکار پاک می‌شه و نیازی به مدیریت دستی حافظه نیست.

🎯 تمرین عملی – WeakSet در مرورگر

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>JavaScript WeakSet Example</title> </head> <body> <h2>JavaScript WeakSet</h2> <pre id="output"></pre> <script> const output = document.getElementById("output"); const ws = new WeakSet(); let obj1 = { name: "Ali" }; let obj2 = { name: "Sara" }; ws.add(obj1); ws.add(obj2); output.innerText += "obj1 in ws? " + ws.has(obj1) + "\n"; // true ws.delete(obj1); output.innerText += "بعد از delete(obj1): " + ws.has(obj1) + "\n"; // false obj2 = null; // حالا چون جایی دیگه رفرنسی نداره، GC به طور خودکار پاکش می‌کنه </script> </body> </html>

📌 نتیجه‌گیری

  • WeakSet مثل Set هست ولی:
    ✅ فقط آبجکت نگه می‌داره
    ✅ قابل پیمایش نیست
    ✅ رفرنس‌ها ضعیف هستن → به صورت خودکار توسط Garbage Collector پاک می‌شن

  • کاربرد: نگهداری اطلاعات خصوصی یا کنترل وضعیت اشیاء بدون نگرانی از مدیریت حافظه.