WeakRef / FinalizationRegistry în JavaScript

Map și Set ES2021

Referințe slabe la obiecte și notificări când un obiect a fost eliberat din memorie.

Sintaxă
const ref = new WeakRef(obiect);
ref.deref()
const registru = new FinalizationRegistry((valoare) => { ... });
registru.register(obiect, valoare, token)
registru.unregister(token)

Ce face WeakRef / FinalizationRegistry

WeakRef ține o referință la un obiect fără să-l păstreze în viață. deref() returnează obiectul dacă încă există sau undefined dacă a fost eliberat de colectorul de memorie (garbage collector).

FinalizationRegistry rulează o funcție la ceva timp după ce un obiect înregistrat cu register a fost eliberat; unregister anulează înregistrarea, folosind tokenul dat. Momentul exact nu este garantat (poate să nu vină deloc), așa că nu pune logică importantă în aceste funcții. Sunt unelte avansate, pentru cache-uri mari și resurse externe.

Parametri

Parametru Descriere
obiect Obiectul urmărit.
valoare Pentru register: valoarea primită de funcție după eliberare (nu obiectul însuși).
token Opțional. Un obiect folosit apoi la unregister.

Ce returnează

deref: obiectul sau undefined. unregister: true dacă a existat o înregistrare.

Exemple

Exemplul 1: O referință slabă cât timp obiectul există

let imagine = { nume: "poza-mare.jpg", octeti: 5_000_000 };
const ref = new WeakRef(imagine);

console.log(ref.deref()?.nume);
imagine = null;
console.log("după ce obiectul nu mai e folosit, deref() poate deveni undefined");

Rezultat

poza-mare.jpg
după ce obiectul nu mai e folosit, deref() poate deveni undefined

Exemplul 2: Înregistrare și anulare

const registru = new FinalizationRegistry((nume) => console.log(`${nume} a fost eliberat`));
const fisier = { nume: "raport.pdf" };
const token = {};

registru.register(fisier, fisier.nume, token);
console.log(registru.unregister(token));
console.log(registru.unregister(token));

Rezultat

true
false

Greșeli frecvente

  • Te bazezi pe FinalizationRegistry ca să închizi fișiere sau conexiuni. Funcția poate rula foarte târziu sau deloc; închide resursele explicit.

Comenzi înrudite

  • WeakMap: Un Map cu chei obiecte, care nu împiedică ștergerea obiectelor din memorie.
  • WeakSet: Un Set de obiecte care nu împiedică ștergerea lor din memorie; util pentru a „marca” obiecte.