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-03Map 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
-
Kalit turlari:
-
Map: Kalit sifatida har qanday qiymatdan foydalanishi mumkin (primitiv va obyektlar).
-
WeakMap: Kalit sifatida faqat obyektlardan foydalanishi mumkin.
-
Kalit havolalari:
-
Map: O'z kalitlariga kuchli havola qiladi.
-
WeakMap: O'z kalitlariga kuchsiz havola qiladi, bu ularga axlat yig'uvchi tomonidan o'chirilishiga imkon beradi.
-
Takrorlanish imkoniyati:
-
Map: Takrorlanuvchi va aylanish uchun metodlarni taqdim etadi.
-
WeakMap: Takrorlanmaydi va uning kalitlari yoki qiymatlariga kirish uchun metodlar taqdim etmaydi.
-
Size xususiyati:
-
Map:
size
xususiyatiga ega. -
WeakMap:
size
xususiyatiga ega emas. -
Qo'llanilish holatlari:
-
Map: Umumiy maqsadli kalit-qiymat saqlash.
-
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
- S: WeakMap-da kalit sifatida primitiv qiymatlardan foydalana olamanmi? J: Yo'q, WeakMap faqat obyektlarni kalit sifatida qabul qiladi.
- S: WeakMap hajmini qanday tekshirish mumkin? J: WeakMap o'zining kuchsiz havola tabiati tufayli hajmini tekshirish uchun xususiyat yoki metod taqdim etmaydi.
- 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.
- 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.
- 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
-
MDN Web Docs:
-
JavaScript.info:
-
Kitoblar:
-
Kyle Simpson tomonidan "You Don't Know JS" seriyasi
-
Marijn Haverbeke tomonidan "Eloquent JavaScript"
-
Onlayn kurslar:
-
Udemy-da JavaScript: The Advanced Concepts
-
Frontend Masters-da Deep JavaScript Foundations, v3
-
GitHub repozitoriyalari:
-
You-Dont-Need-Lodash-Underscore - Sof JavaScript-da Map va WeakMap foydalanish misollari
-
Maqolalar:
-
Jason Orendorff tomonidan ES6 In Depth: Collections
-
DigitalOcean tomonidan Understanding Map and WeakMap in JavaScript