WeakMap և WeakSet JavaScript-ում
WeakMap և WeakSet տվյալների կառուցվածքներ են, որոնք թույլ հղումներ են պահում օբյեկտների վրա։ Դրանք նախատեսված են իրավիճակների համար, երբ ցանկանում ես պահել տվյալներ, որոնք չեն խոչընդոտում Garbage Collector-ին այդ օբյեկտները ազատել՝ եթե այլևս հղում չկա։
WeakMap
WeakMap-ը նման է Map-ին, սակայն այն ունի հետևյալ սահմանափակումները՝
- Բանալիները պետք է լինեն միայն օբյեկտներ (ոչ string, ոչ number)
- Այն iterable չէ, այսինքն՝ չի կարելի օգտագործել `for...of` կամ `forEach`
- Դու չես կարող ստանալ դրա ամբողջ պարունակությունը
const wm = new WeakMap();
let user = { name: "Ani" };
wm.set(user, "some metadata");
console.log(wm.get(user)); // "some metadata"
user = null; // Այժմ օբյեկտի վրա հղում չկա => GC կարող է ջնջել այն և WeakMap-ում էլ կմաքրվի
Երբ օգտագործել WeakMap:
- Երբ ուզում ես պահել "մասնավոր" տվյալներ օբյեկտների համար՝ առանց խանգարելու օբյեկտի հեռացումը GC-ի կողմից
- Օգտագործվում է cache-երում, metadata պահելու համար
WeakSet
WeakSet-ը նման է Set-ին, բայց՝
- Պարունակում է միայն օբյեկտներ (ոչ primitive արժեքներ)
- Սա էլ է iterableչէ
- Օբյեկտի վրա միակ հղումը WeakSet-ում լինելու դեպքում, GC-ը կջնջի այն
const ws = new WeakSet();
let user = { name: "Karen" };
ws.add(user);
console.log(ws.has(user)); // true
user = null; // Այժմ օբյեկտը կարող է մաքրվել GC-ի կողմից
Երբ օգտագործել WeakSet:
- Երբ քեզ պետք է հիշել միայն այն օբյեկտները, որոնց հետ արդեն աշխատել ես (օր.՝ process-ով անցածները)
- Օգտակար է observer pattern-ներում, visited նշաններ ստեղծելիս
Տարբերությունը Map/Set-ի և WeakMap/WeakSet-ի միջև
| Հատկություն | Map / Set | WeakMap / WeakSet |
|---|---|---|
| Կարող են պարունակել primitive արժեքներ | Այո | Ոչ, միայն օբյեկտներ |
| Իրականացնում են iterable interface | Այո | Ոչ |
| Կարելի է ստանալ ամբողջ պարունակությունը | Այո | Ոչ |
| Համատեղելի են GC-ի հետ | Ոչ՝ պահում են ուժեղ հղում | Այո՝ թույլ հղում, GC-ը կարող է մաքրել |
Եզրափակում
WeakMap և WeakSet նախատեսված են այն իրավիճակների համար, երբ ցանկանում ենք պահել օբյեկտներին կցված տվյալներ՝ առանց խոչընդոտելու դրանց հավաքումը garbage collector-ի կողմից։ Դրանք ուժեղ գործիքներ են՝ memory leak-ից խուսափելու և հիշողության արդյունավետ կառավարում ապահովելու համար։