Nei precedenti script abbiamo trattato le strutture Map e Set. La prima è da utilizzare come dizionario chiave/valore, mentre la seconda per una lista di oggetti unici ordinati. In questo script, aggiungiamo anche le strutture WeakMap e WeakSet che svolgono la medesima funzione, ma non creano un riferimento forte con gli oggetti che contengono. Ma facciamo un passo indietro per capire meglio.
In JavaScript il Garbage Collector è incaricato di ripulire periodicamente la memoria dagli oggetti non più utilizzati o, per meglio dire, raggiungibili. Osserviamo il codice seguente.
let user = { name: "Morgan" }; user = null;
È chiaro che la sezione di memoria in cui ho salvato le proprietà dell'utente, non potendo essere più raggiunta, può essere cancellata per recuperare spazio.
Se inserissimo l'utente in un'oggetto di tipo Map, potendo essere raggiunto sia tramite una referenza dell'oggetto stesso che tramite Map, il garbage collector non effetturà alcuna operazione.
let user = { name: "Morgan" }; let map = new Map(); map.set(user, "valore"); // anche se rimossa la referenza all'oggetto, i valori sono raggiungibili tramite il map.keys() user = null;
Vi sono però scenari in cui il Map o il Set devono essere elementi di utilità per il salvataggio di valori (cache), ma non devono mantenere una referenza verso essi, consentendone così la rimozione automatica quando il programma non ne necessiterà più.
let cache = new WeakMap(); function getValue(obj,cb) { if (!cache.has(obj)) { let result = cb(); cache.set(obj, result); return result; } return cache.get(obj); } let user = { name: "Morgan" }; let result1 = getValue(user,miaFunzione); let result2 = getValue(user,miaFunzione); // [...] user = null;
Il codice appena mostrato fa capire le potenzialità di questo strumento: il valore in cache è calcolato una sola volta alla prima chiamata getValue. Da quel momento in avanti il valore sarà subito disponibile, senza passare nuovamente dalla callback, fintanto che la variabile user manterrà il riferimento o non verrà sovrascritta. In quel momento la chiave all'interno di Map cesserà di esistere, andando a perdere anche il valore all'interno della cache.
Dato il loro funzionamento, all'interno di una WeakMap è possibile utilizzare solo oggetti come chiavi, al tempo stesso in un WeakSet possiamo inserire solo oggetti. Inoltre, potendo contenere informazioni volatili, non è possibile iterare sugli oggetti presenti; le uniche operazioni disponibili sono set, get, delete e has.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Eseguire un metodo asincrono dopo il set di una proprietà in Blazor 8
Hosting di componenti WebAssembly in un'applicazione Blazor static
Eseguire query manipolando liste di tipi semplici con Entity Framework Core
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Gestire liste di tipi semplici con Entity Framework Core
Usare lo spread operator con i collection initializer in C#
Utilizzare il nuovo modello GPT-4o con Azure OpenAI
Disabilitare automaticamente un workflow di GitHub (parte 2)
Definire stili a livello di libreria in Angular
Cancellare una run di un workflow di GitHub
Utilizzare Model as a Service su Microsoft Azure
Cambiare la chiave di partizionamento di Azure Cosmos DB
I più letti di oggi
- Organizzare il codice JavaScript utilizzando i moduli
- Utilizzare Azure Cosmos DB con i vettori
- Comunicazione bidirezionale con WebSockets e HTML5
- Recuperare i file utilizzati di recente in un'Universal App
- Gestione avanzata delle Progress Bar con Bootstrap
- Conoscere quando una periferica viene collegata nelle Universal App
- Disponibile Internet Explorer 10 Platform Preview 2 (IE10 PP2): ancora più supporto ad HTML5
- I nuovi tag figure e figcaption in HTML5
- Utilizzare il microfono nelle applicazioni Windows Phone