Map va WeakMap

JavaScriptda Map va WeakMap ma'lumotlar tuzilmalari (data structures) bo'lib, ular kalit-qiymat (key-value) juftliklarini boshqarish uchun ishlatiladi. Ushbu maqolada ularning asosiy farqlari, afzalliklari va kamchiliklari haqida batafsil tushuntiramiz.

So'nggi yangilanish: 2024-01-03

Map va WeakMap-ga kirish

Map va WeakMap - bu ECMAScript 2015 (ES6) da taqdim etilgan ikkita kuchli ma'lumotlar tuzilmasi. Ular kalit-qiymat juftliklarini saqlash uchun samarali usullarni taqdim etadi va turli dasturlash vaziyatlariga mos keladigan noyob xususiyatlarni taklif qiladi.

JavaScript-da Map

Map - bu Object-ga o'xshash kalitli ma'lumotlar to'plami. Biroq, Map har qanday turdagi kalitlarni, shu jumladan obyektlarni ham qo'llab-quvvatlaydi va elementlarning kiritilish tartibini saqlaydi.

Map yaratish

Siz Map konstruktori yordamida Map yaratishingiz mumkin:

const myMap = new Map();

Shuningdek, siz Map-ni kalit-qiymat juftliklarining takrorlanuvchisi bilan ishga tushirishingiz mumkin:

const myMap = new Map([
  ['key1', 'value1'],
  ['key2', 'value2']
]);

Map metodlari

Map bir nechta foydali metodlarni taqdim etadi:

  • set(key, value): Map-ga yangi kalit-qiymat juftligini qo'shadi.
  • get(key): Ko'rsatilgan kalit bilan bog'liq qiymatni oladi.
  • has(key): Map-da kalit mavjudligini tekshiradi.
  • delete(key): Ko'rsatilgan kalitga ega kalit-qiymat juftligini o'chiradi.
  • clear(): Map-dan barcha kalit-qiymat juftliklarini o'chiradi.

Misol:

const myMap = new Map();

myMap.set('name', 'John');
myMap.set('age', 30);

console.log(myMap.get('name')); // Natija: John
console.log(myMap.has('age')); // Natija: true

myMap.delete('age');
console.log(myMap.has('age')); // Natija: false

myMap.clear();
console.log(myMap.size); // Natija: 0

Map xususiyatlari

  • size: Map-dagi kalit-qiymat juftliklari sonini qaytaradi.

Map bo'ylab aylanish

Map-lar takrorlanuvchi va aylanish uchun bir nechta metodlarni taqdim etadi:

  • keys(): Kalitlar takrorlanuvchisini qaytaradi.
  • values(): Qiymatlar takrorlanuvchisini qaytaradi.
  • entries(): Kalit-qiymat juftliklari takrorlanuvchisini qaytaradi.
  • forEach(): Har bir kalit-qiymat juftligi uchun berilgan funksiyani bajaradi.

Misol:

const myMap = new Map([
  ['a', 1],
  ['b', 2],
  ['c', 3]
]);

for (const [key, value] of myMap) {
  console.log(`${key}: ${value}`);
}

myMap.forEach((value, key) => {
  console.log(`${key}: ${value}`);
});

Map-ning qo'llanilish holatlari

  • Keshlashtirish va memoizatsiya
  • Obyektlar uchun metama'lumotlarni saqlash
  • Tez-tez qidirishlarni talab qiladigan algoritmlarni amalga oshirish
  • Lug'atlar yoki xesh-jadvallar yaratish

JavaScript-da WeakMap

WeakMap - bu kalit-qiymat juftliklari to'plami bo'lib, unda kalitlar obyektlar bo'lishi kerak va ular kuchsiz bog'langan. Bu shuni anglatadiki, agar kalit obyektiga boshqa havolalar bo'lmasa, u axlat yig'uvchi tomonidan o'chirilishi mumkin.

WeakMap yaratish

Siz WeakMap konstruktori yordamida WeakMap yaratishingiz mumkin:

const myWeakMap = new WeakMap();

WeakMap metodlari

WeakMap Map metodlarining kichik to'plamini taqdim etadi:

  • set(key, value): WeakMap-ga yangi kalit-qiymat juftligini qo'shadi.
  • get(key): Ko'rsatilgan kalit bilan bog'liq qiymatni oladi.
  • has(key): WeakMap-da kalit mavjudligini tekshiradi.
  • delete(key): Ko'rsatilgan kalitga ega kalit-qiymat juftligini o'chiradi.

Misol:

const myWeakMap = new WeakMap();
const obj1 = {};
const obj2 = {};

myWeakMap.set(obj1, 'value1');
myWeakMap.set(obj2, 'value2');

console.log(myWeakMap.get(obj1)); // Natija: value1
console.log(myWeakMap.has(obj2)); // Natija: true

myWeakMap.delete(obj2);
console.log(myWeakMap.has(obj2)); // Natija: false

WeakMap xususiyatlari

WeakMap-larda size xususiyati yoki ularning tarkibini aylanib chiqish uchun hech qanday metod yo'q.

WeakMap-ning qo'llanilish holatlari

  • DOM tugunlari bilan metama'lumotlarni bog'lash
  • Xotiradan samarali foydalanuvchi keshlarni amalga oshirish
  • Obyektlar uchun shaxsiy ma'lumotlarni saqlash
  • Uzoq vaqt ishlaydigan ilovalarda xotira sizishlarining oldini olish

Map va WeakMap o'rtasidagi farqlar

  1. Kalit turlari:

  2. Map: Kalit sifatida har qanday qiymatdan foydalanishi mumkin (primitiv va obyektlar).

  3. WeakMap: Kalit sifatida faqat obyektlardan foydalanishi mumkin.

  4. Kalit havolalari:

  5. Map: O'z kalitlariga kuchli havola qiladi.

  6. WeakMap: O'z kalitlariga kuchsiz havola qiladi, bu ularga axlat yig'uvchi tomonidan o'chirilishiga imkon beradi.

  7. Takrorlanish imkoniyati:

  8. Map: Takrorlanuvchi va aylanish uchun metodlarni taqdim etadi.

  9. WeakMap: Takrorlanmaydi va uning kalitlari yoki qiymatlariga kirish uchun metodlar taqdim etmaydi.

  10. Size xususiyati:

  11. Map: size xususiyatiga ega.

  12. WeakMap: size xususiyatiga ega emas.

  13. Qo'llanilish holatlari:

  14. Map: Umumiy maqsadli kalit-qiymat saqlash.

  15. WeakMap: Obyekt kalitlari va xotira boshqaruvi bilan bog'liq maxsus qo'llanilish holatlari.

Ishlash samaradorligi bo'yicha mulohazalar

  • Map-lar odatda obyektlarga nisbatan kalit-qiymat juftliklarini tez-tez qo'shish va o'chirish uchun yaxshiroq ishlaydi.
  • WeakMap-lar ma'lumotlarni obyektlar bilan bog'lash kerak bo'lgan, lekin axlat yig'ishga to'sqinlik qilmaslik kerak bo'lgan holatlarda xotira sizishlarining oldini olishga yordam beradi.
  • Kichik to'plamlar uchun Map va Object o'rtasidagi ishlash farqi sezilarli bo'lmasligi mumkin.

Eng yaxshi amaliyotlar

  • Har qanday turdagi kalitlarga ega kalit-qiymat juftliklarini saqlash kerak bo'lganda Map-dan foydalaning.
  • Axlat yig'ishga to'sqinlik qilmasdan ma'lumotlarni obyektlar bilan bog'lash kerak bo'lganda WeakMap-dan foydalaning.
  • Kalitlar ish vaqtigacha noma'lum bo'lganda yoki barcha kalitlar bir xil turda va barcha qiymatlar bir xil turda bo'lganda Object o'rniga Map-ni afzal ko'ring.
  • Axlat yig'ilishi mumkin bo'lgan obyektlar uchun keshlarni amalga oshirish yoki metama'lumotlarni saqlash uchun WeakMap-dan foydalaning.

Tez-tez so'raladigan savollar

  1. S: WeakMap-da kalit sifatida primitiv qiymatlardan foydalana olamanmi? J: Yo'q, WeakMap faqat obyektlarni kalit sifatida qabul qiladi.
  2. S: WeakMap hajmini qanday tekshirish mumkin? J: WeakMap o'zining kuchsiz havola tabiati tufayli hajmini tekshirish uchun xususiyat yoki metod taqdim etmaydi.
  3. S: Map va WeakMap oqim xavfsizmi? J: JavaScript bir oqimli, shuning uchun oqim xavfsizligi muammo emas. Biroq, agar siz Web Worker-lardan foydalansangiz, har bir worker o'zining global doirasi va xotirasiga ega.
  4. S: Map va WeakMap-dan eski brauzerlardan foydalana olamanmi? J: Map va WeakMap barcha zamonaviy brauzerlarda qo'llab-quvvatlanadi. Eski brauzerlar uchun siz polyfill-dan foydalanishingiz yoki kodingizni transpilatsiya qilishingiz kerak bo'lishi mumkin.
  5. S: Map-ni massivga qanday o'tkazish mumkin? J: Siz yoyish operatori yoki Array.from()-dan foydalanishingiz mumkin:
const myMap = new Map([['a', 1], ['b', 2]]);
const array = [...myMap];
// yoki
const array = Array.from(myMap);

Qo'shimcha manbalar

  1. MDN Web Docs:

  2. Map

  3. WeakMap

  4. JavaScript.info:

  5. Map va Set

  6. WeakMap va WeakSet

  7. Kitoblar:

  8. Kyle Simpson tomonidan "You Don't Know JS" seriyasi

  9. Marijn Haverbeke tomonidan "Eloquent JavaScript"

  10. Onlayn kurslar:

  11. Udemy-da JavaScript: The Advanced Concepts

  12. Frontend Masters-da Deep JavaScript Foundations, v3

  13. GitHub repozitoriyalari:

  14. You-Dont-Need-Lodash-Underscore - Sof JavaScript-da Map va WeakMap foydalanish misollari

  15. Maqolalar:

  16. Jason Orendorff tomonidan ES6 In Depth: Collections

  17. DigitalOcean tomonidan Understanding Map and WeakMap in JavaScript