WeakMap و WeakSet در جاوا اسکریپت

WeakMap و WeakSet در جاوا اسکریپت

Garbage-Collector در جاوا اسکریپت (در اصل انجین های جاوا اسکریپت مثل v8)  تا وقتی که  یک متغیر  قابل دسترسی باشد، آن را از حافظه حذف نمی کند. به عنوان مثال کد زیر رو در نظر بگیرید:

let user = {
  name: "John"
};

حالا اگر مقدار user رو برابر null قرار بدیم این آبجکت از حافظه حذف میشه.

user = null;

ولی در حالت زیر:

let user = {
  name: "John"
};

let admin = user;
user = null;

توی حالات بالا از اونجایی که admin یک reference به آبجکت user دارد، درسته که مقدار user برابر null قرار داده شده ولی به خاطر این که رفرنس admin هنوز توی حافظه هست پس مقدار این آبجکت از حافظه حذف نمیشه.

عملکرد مشابه ای در حالتی که آبجکت user رو توی یک آرایه، map و set قرار بدیم خواهیم داشت:

حالا توی جاوا اسکریپ دو تا ساختمان داده ی دیگه به اسم های WeakMap و WeakSet داریم که مشابه Map و Set هستند با این تفاوت که تنها Object و آرایه و Non-Registered Symbol ها رو به عنوان Key قبول می کنند، اینجوری وقتی که Key مقدار Null بگیره از طریف WeakMap یا WeakSet هم قابل دسترسی نخواهد بود و اینجوری Garbage-Collector محتوای اون رو از حافظه پاک میکنه.

weakMap.set(john, "secret documents");

توی مثال بالا اگر John حذف بشه محتوای اون هم از حافظه حذف میشه. به همین دلیل اگر میخواین قابلیت Caching رو برنامه تون اضافه کنید استفاده از WeakMap و WeakSet گزینه ی خیلی بهتریه تا این که از Map و Set استفاده کنید.

به عنوان نکته ی آخر هم این رو در نظر داشته باشید که WeakMap و WeakSet  از توابع clear, size, values, entries و keys پشتیبانی نمی کنند.

در خصوص WeakSet هم عملکرد مشابه Set داره و تفاوتش با Map توی اینه که به صورت key-value نیست و مقادیر تکراری هم داخلش قرار نمی گیره.

let visitedSet = new WeakSet();

let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };

visitedSet.add(john); // John visited us
visitedSet.add(pete); // Then Pete
visitedSet.add(john); // John again

// visitedSet has 2 users now

// check if John visited?
alert(visitedSet.has(john)); // true

// check if Mary visited?
alert(visitedSet.has(mary)); // false

john = null;

// visitedSet will be cleaned automatically

برای مثال های بیشتر میتونید به لینک های زیر مراجعه کنید:

WeakMap and WeakSet (javascript.info)

Garbage collection (javascript.info)

از بهترین نوشته‌های کاربران سکان آکادمی در سکان پلاس


online-support-icon