WeakMap în JavaScript

Map și Set ES2015 (ES6)

Un Map cu chei obiecte, care nu împiedică ștergerea obiectelor din memorie.

Sintaxă
const wm = new WeakMap();
wm.set(obiect, valoare)
wm.get(obiect)
wm.has(obiect)
wm.delete(obiect)

Ce face WeakMap

Într-un WeakMap, cheile trebuie să fie obiecte (sau simboluri nefolosite cu Symbol.for). Legătura cu cheia este „slabă”: dacă obiectul-cheie nu mai este folosit nicăieri altundeva, el și valoarea asociată pot fi eliberate automat din memorie.

Din acest motiv, un WeakMap nu poate fi parcurs și nu are size sau clear: are doar set, get, has și delete. Se folosește pentru date atașate unor obiecte pe care nu le controlezi (elemente DOM, obiecte primite din altă bibliotecă) și pentru cache.

Parametri

Parametru Descriere
perechi Opțional, la creare: perechi [obiect, valoare].

Ce returnează

Un obiect WeakMap.

Exemple

Exemplul 1: Date private atașate unor obiecte

const clicuri = new WeakMap();
const buton = { id: "trimite" };

clicuri.set(buton, 0);
clicuri.set(buton, clicuri.get(buton) + 1);
console.log(clicuri.get(buton), clicuri.has(buton));
console.log(clicuri.delete(buton), clicuri.has(buton));

Rezultat

1 true
true false

Exemplul 2: Cache pentru un calcul scump

const cache = new WeakMap();

function total(cos) {
  if (!cache.has(cos)) {
    console.log("calculez...");
    cache.set(cos, cos.reduce((s, p) => s + p.pret, 0));
  }
  return cache.get(cos);
}

const cos = [{ pret: 20 }, { pret: 35 }];
console.log(total(cos));
console.log(total(cos));

Rezultat

calculez...
55
55

Greșeli frecvente

  • Folosești un text ca cheie: wm.set("id", 1) aruncă TypeError: Invalid value used as weak map key.

Comenzi înrudite

  • Map (get, set, has, delete): O colecție de perechi cheie–valoare în care cheile pot fi de orice tip și ordinea este păstrată.
  • WeakSet: Un Set de obiecte care nu împiedică ștergerea lor din memorie; util pentru a „marca” obiecte.
  • WeakRef / FinalizationRegistry: Referințe slabe la obiecte și notificări când un obiect a fost eliberat din memorie.