Ma'lumot turlari

WeakMap va WeakSet

WeakMap va WeakSet โ€” Map va Set ning "kuchsiz" (weak) versiyalari. Ular xotira boshqaruvida muhim rol o'ynaydi va bir necha jiddiy cheklovga ega. Avval JavaScript qanday qilib keraksiz obyektlarni xotiradan tozalashini eslaylik.

Erishuvchanlik va axlat yig'uvchi (garbage collector)

JavaScript dvigateli xotirani avtomatik boshqaradi. Obyekt xotirada saqlanadi, chunki unga havola (reference) bor. Havolasi qolmagan (erishib bo'lmaydigan) obyekt "axlat" hisoblanadi va xotiradan tozalanadi.

gc.js
// natija shu yerda chiqadi

Muhim jihat: oddiy Map yoki Set o'z kalit/qiymatlariga havolani kuchli saqlaydi. Ya'ni, agar obyekt Map da kalit bo'lsa, boshqa hamma joyda havola yo'qolsa ham, Map uni ushlab turadi va xotiradan tozalanmaydi.

WeakMap kuchsiz havola saqlaydi

WeakMap aynan shu bilan farq qiladi: u kalit-obyektga kuchsiz havola saqlaydi. Agar obyektga boshqa havola qolmasa, u WeakMap da kalit bo'lishiga qaramay, xotiradan tozalanadi (va WeakMap dan ham avtomatik yo'qoladi).

weakmap-basic.js
// natija shu yerda chiqadi

Jiddiy cheklovlar

Kuchsiz havolalar tabiati tufayli WeakMap juda cheklangan:

Nima uchun iteratsiya taqiqlangan? Chunki axlat yig'uvchi qachon ishlashi noaniq โ€” obyekt hozir tozalanganmi yoki yo'qmi, bilib bo'lmaydi. Shuning uchun WeakMap dagi barcha elementlarni ro'yxatlashning aniq usuli yo'q va bunday metodlar berilmaydi.
weakmap-limits.js
// natija shu yerda chiqadi
Primitivni kalit qilishga urinish xatolik beradi: weakMap.set('satr', 1) โ€” TypeError. WeakMap kaliti majburan obyekt bo'lishi kerak.

Qo'llanish 1: qo'shimcha ma'lumot saqlash

WeakMap ning asosiy foydasi โ€” begona obyektga tegib ketmasdan unga qo'shimcha ma'lumot bog'lash. Masalan, tashqi kutubxona bergan obyektlar uchun tashriflar sonini hisoblaymiz:

weakmap-usecase.js
// natija shu yerda chiqadi

Agar bu yerda oddiy Map ishlatilsa, foydalanuvchi obyekti dasturda o'chirilganda ham Map undagi yozuvni ushlab turardi. Bu xotira sizishiga (memory leak) olib kelardi. WeakMap bu muammoni hal qiladi.

Qo'llanish 2: keshlash (caching)

Agar funksiya natijasini obyekt bo'yicha keshlamoqchi bo'lsak, WeakMap ideal: obyekt yashaguncha kesh saqlanadi, obyekt yo'qolganda kesh ham avtomatik tozalanadi.

weakmap-cache.js
// natija shu yerda chiqadi

WeakSet

WeakSet โ€” Set ning kuchsiz varianti. U ham xuddi shunday cheklovlarga ega:

WeakSet ko'pincha obyektning "ha/yo'q" holatini belgilash uchun ishlatiladi โ€” masalan, foydalanuvchi saytga tashrif buyurganmi:

weakset.js
// natija shu yerda chiqadi

Asosiy cheklov va tavsiya

WeakMap va WeakSet ning eng katta cheklovi โ€” ular bo'yicha aylanish yoki barcha joriy mazmunini olishning imkoni yo'qligi. Bu noqulaylikdek tuyulishi mumkin, lekin aslida ular bajaradigan vazifa uchun bu to'sqinlik qilmaydi. Ular asosiy ma'lumotni boshqa joyda saqlab, faqat qo'shimcha yordamchi ma'lumotni WeakMap/WeakSet da saqlashga mo'ljallangan.
Qoida sifatida: agar obyektlarni kalit qilib ishlatayotgan bo'lsangiz va ular obyektning "asosiy" yashash muddatiga bog'lanishi kerak bo'lsa, WeakMap/WeakSet dan foydalaning. Aks holda oddiy Map/Set ni tanlang.

Xulosa