WeakMap va WeakSet

...

WeakMap va WeakSet

Biz bilamizki, JavaScriptda qiymatlar xotirada "erishish mumkin" bo'lgan vaqtgacha saqlanadi va ular foydalanilishi mumkin.

Masalan:

let john = { name: 'John' };
 
// Ob'ektga erishish mumkin, chunki john unga murojaat qilmoqda
 
// Murojaatni yangilang
john = null;
 
// Ob'ekt xotiradan o'chiriladi

Odatda, ob'ektning xususiyatlari yoki massiv elementlari yoki boshqa ma'lumotlar tuzilmalari mavjud ekan, xotirada saqlanadi.

Masalan, agar biz ob'ektni massivga qo'ysak, massiv mavjud ekan, ob'ekt ham xotirada saqlanadi, hatto boshqa hech qanday murojaatlar bo'lmasa ham:

let john = { name: 'John' };
 
let array = [john];
 
john = null; // Murojaatni yangilang
 
// John's ob'ekti hali ham massiv ichida saqlanmoqda
// Shuning uchun u xotiradan o'chirilmaydi
// Uni array[0] orqali olish mumkin

Huddi shunday, agar biz oddiy Map’da ob'ektni kalit sifatida ishlatsak, Map mavjud ekan, ob'ekt ham mavjud bo'ladi. U xotirani egallab turadi va garbage-collect qilinmaydi.

Masalan:

let john = { name: 'John' };
 
let map = new Map();
map.set(john, '...');
 
john = null; // Murojaatni yangilang
 
// John Map ichida saqlangan,
// Uni map.keys() orqali olish mumkin

WeakMap bu holatda tubdan boshqacha ishlaydi. U kalit ob'ektlarning garbage-collect qilinishiga to'sqinlik qilmaydi.

WeakMap

WeakMap bilan Map o'rtasidagi birinchi farq shundaki, WeakMap’da kalitlar faqat ob'ektlar bo'lishi mumkin, primitiv qiymatlar emas:

let weakMap = new WeakMap();
 
let obj = {};
 
weakMap.set(obj, 'ok'); // Ob'ekt kaliti orqali ishlamoqda
 
// Qatorni kalit sifatida ishlatib bo'lmaydi
weakMap.set('test', 'Whoops'); // Xato: "test" ob'ekt emas

Endi, agar biz ob'ektni kalit sifatida ishlatadigan bo'lsak va boshqa murojaatlar bo'lmasa, u xotiradan avtomatik ravishda o'chiriladi (va Map’dan ham).

let john = { name: 'John' };
 
let weakMap = new WeakMap();
weakMap.set(john, '...');
 
john = null; // Murojaatni yangilang
 
// John xotiradan o'chiriladi!

Oddiy Map bilan taqqoslanganda, WeakMap’da agar ob'ekt faqat kalit sifatida mavjud bo'lsa, u avtomatik ravishda xotiradan (va WeakMap’dan) o'chiriladi.

WeakMap iteratsiyani qo'llab-quvvatlamaydi va keys(), values(), entries() kabi metodlarga ega emas, shuning uchun undan barcha kalitlar yoki qiymatlarni olishning iloji yo'q.

WeakMap faqat quyidagi metodlarga ega:

  • weakMap.set(key, value)
  • weakMap.get(key)
  • weakMap.delete(key)
  • weakMap.has(key)

Ishlatish holati: qo'shimcha ma'lumotlar

WeakMap asosan qo'shimcha ma'lumotlarni saqlash uchun ishlatiladi. Agar biz uchinchi tomon kutubxonasiga tegishli ob'ekt bilan ishlayotgan bo'lsak va unga bog'liq ma'lumotlarni saqlamoqchi bo'lsak, ammo bu ma'lumot faqat ob'ekt mavjud ekan saqlanishi kerak bo'lsa, unda WeakMap aynan kerakli yechimdir.

let john = { name: 'John' };
 
weakMap.set(john, 'maxfiy hujjatlar');
// Agar john ob'ekti o'chsa, maxfiy hujjatlar ham avtomatik ravishda yo'qoladi

WeakSet

WeakSet ham xuddi shunday ishlaydi:

  • U Set ga o'xshaydi, ammo faqat ob'ektlarni qo'shish mumkin (primitiv qiymatlarni emas).
  • Ob'ekt boshqa joydan erishib bo'ladigan bo'lsa, u WeakSet ichida saqlanadi.
  • WeakSet’da add, has, delete metodlari bor, ammo size, keys() yoki iteratsiyalar yo'q.

Masalan, foydalanuvchilarni kuzatib borish uchun WeakSet ishlatish mumkin:

let visitedSet = new WeakSet();
 
let john = { name: 'John' };
let pete = { name: 'Pete' };
 
visitedSet.add(john); // John bizga tashrif buyurdi
visitedSet.add(pete); // Keyin Pete
 
alert(visitedSet.has(john)); // true

Xulosa

  • WeakMap - bu Map ga o'xshash tuzilma bo'lib, u faqat ob'ektlarni kalit sifatida ishlatadi va ular boshqa yo'llar bilan erishib bo'lmasa, qiymatlar bilan birga avtomatik ravishda xotiradan o'chiriladi.
  • WeakSet - bu Set ga o'xshash tuzilma bo'lib, faqat ob'ektlarni saqlaydi va ular boshqa yo'llar bilan erishib bo'lmasa, avtomatik ravishda xotiradan o'chiriladi.

Bu tuzilmalar ob'ektlarni boshqarish bilan bog'liq bo'lgan qo'shimcha ma'lumotlarni saqlash uchun ishlatiladi va ob'ektlar asosiy saqlashdan o'chirilganidan keyin avtomatik ravishda tozalanadi.

Ushbu sahifada

GitHubda tahrirlash