مقدمه

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

WeakMap چیست و چه کاربردی دارد؟

WeakMap یک نوع داده در جاوااسکریپت است که برای نگهداری زوج‌های کلید-مقدار طراحی شده است، اما با ویژگی‌های خاصی که آن را از Map متمایز می‌کند. در ادامه به بررسی ویژگی‌ها، محدودیت‌ها و کاربردهای WeakMap می‌پردازیم.

تعریف WeakMap

WeakMap تقریباً مانند Map است، اما فقط می‌تواند اشیاء (Object) را به عنوان کلید داشته باشد و کلیدهای غیر شیء را قبول نمی‌کند. تفاوت اساسی WeakMap در این است که اگر هیچ ارجاع دیگری به کلید (شیء) در کد شما باقی نماند، کلید و مقدار مرتبط با آن به طور خودکار توسط Garbage Collector پاک می‌شوند. این ویژگی مخصوص زمانی است که بخواهید داده‌هایی را موقت و وابسته به حیات شیء ذخیره کنید.

Garbage Collector چیست؟

Garbage Collector (زباله‌روب) که به اختصار GC نامیده می‌شود، سیستمی در موتور جاوااسکریپت است که به طور خودکار حافظه اشیائی را که دیگر هیچ ارجاعی به آن‌ها وجود ندارد، آزاد می‌کند. این کار باعث می‌شود برنامه‌نویس نیازی به مدیریت دستی حافظه نداشته باشد و از نشت حافظه جلوگیری شود.

این کار باعث می‌شود حافظه برنامه شما همیشه پاک و بدون نشت (Memory Leak) باقی بماند و مدیریت منابع ساده‌تر شود.

Copy Icon JAVASCRIPT
let wm = new WeakMap();
let obj = {};
wm.set(obj, "data");
console.log(wm.get(obj)); // "data"
obj = null; // کلید و مقدارش از حافظه پاک می‌شوند

اگر هیچ متغیری به obj اشاره نکند، مقدار مرتبط در WeakMap هم حذف می‌شود.

محدودیت‌های WeakMap

برخلاف Map، نمی‌توانید WeakMap را پیمایش کنید یا اندازه آن را بدانید (یعنی متدهایی مانند keys، values یا پراپرتی size وجود ندارند). این محدودیت به این دلیل است که پاک‌سازی داده‌ها کاملاً اتوماتیک و وابسته به جمع‌آوری زباله (garbage collection) است.

WeakSet چیست و چه کاربردی دارد؟

WeakSet مشابه WeakMap است، اما برای نگهداری مجموعه‌ای از اشیاء طراحی شده است. این نوع داده به شما امکان می‌دهد تا مجموعه‌ای از اشیاء را نگهداری کنید که در صورت حذف شیء از حافظه، به طور خودکار از WeakSet نیز حذف می‌شوند. این ویژگی باعث می‌شود که WeakSet برای مواردی مانند نگهداری اشیاء فعال یا مشاهده‌گر (observer) بسیار مناسب باشد.

تعریف WeakSet

WeakSet ساختاری مشابه Set دارد با این تفاوت که فقط اشیاء می‌توانند عضو آن باشند و مقدارهای primitive (مثل عدد یا رشته) مجاز نیستند. اگر شیء اضافه‌شده به WeakSet در هیچ متغیر دیگری وجود نداشته باشد، به طور خودکار از WeakSet حذف می‌شود.

این ویژگی برای نگهداری لیستی از اشیاء فعال یا مشاهده‌گر (observer) که نباید مانع حذف شدن از حافظه شوند، بسیار کاربرد دارد.

Copy Icon JAVASCRIPT
let ws = new WeakSet();
let user = { name: "Ali" };
ws.add(user);
console.log(ws.has(user)); // true
user = null; // شیء و مرجعش پاک می‌شود

محدودیت‌های WeakSet

مانند WeakMap، متدهایی برای پیمایش یا به دست آوردن اندازه مجموعه وجود ندارد و فقط متدهای add، delete و has در دسترس هستند.

کاربرد عملی و تفاوت با Map/Set

از WeakMap و WeakSet معمولاً برای مدیریت داده‌هایی که باید وابسته به حیات شیء اصلی باشند و در صورت حذف شیء، از حافظه پاک شوند، استفاده می‌شود. مثلاً در فریم‌ورک‌های مدرن، ذخیره اطلاعات جانبی برای عناصر DOM بدون نگرانی بابت نشت حافظه، با WeakMap انجام می‌شود.

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