Skip to content

Commit 2bc73c3

Browse files
committed
review weakMap-weakSet
1 parent b20efef commit 2bc73c3

File tree

3 files changed

+36
-25
lines changed

3 files changed

+36
-25
lines changed
Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,47 @@
1+
Memorizziamo i messaggi letti in `WeakSet`:
2+
3+
```js run
4+
let messages = [
5+
{text: "Hello", from: "John"},
16
{text: "How goes?", from: "John"},
27
{text: "See you soon", from: "Alice"}
38
];
49

510
let readMessages = new WeakSet();
611

7-
// two messages have been read
12+
//due messaggi sono stati letti
813
readMessages.add(messages[0]);
914
readMessages.add(messages[1]);
10-
// readMessages has 2 elements
15+
// readMessages ha due elementi
1116

12-
// ...let's read the first message again!
17+
//...leggiamo nuovamente il primo messaggio!
1318
readMessages.add(messages[0]);
14-
// readMessages still has 2 unique elements
19+
// readMessages ha 2 elementi unici
1520

16-
// answer: was the message[0] read?
21+
//risposta: message[0] è stato letto?
1722
alert("Read message 0: " + readMessages.has(messages[0])); // true
1823

1924
messages.shift();
20-
// now readMessages has 1 element (technically memory may be cleaned later)
25+
// ora readMessages ha un elemento (tecnicamente la memoria potrebbe essere ripulita dopo)
2126
```
2227

2328
La struttura `WeakSet` consente di memorizzare un insieme di messaggi e di verificare molto rapidamente la presenza di un dato messaggio.
2429

2530
Viene ripulita automaticamente. Il lato negativo è che non possiamo eseguire iterazioni. Non possiamo ottenere direttamente "tutti i messaggi letti". Ma possiamo farlo iterando su tutti i messaggi e filtrando tutti quelli che sono presenti nel set.
2631

27-
P.S. Aggiungere una proprietà ad ogni messaggio potrebbe essere pericoloso, se questo oggetto viene gestito dal codice di un'altra persona; per evitare conflitti possiamo utilizzare un *symbol*.
32+
Another, different solution could be to add a property like `message.isRead=true` to a message after it's read. As messages objects are managed by another code, that's generally discouraged, but we can use a symbolic property to avoid conflicts.
33+
34+
Un'altra soluzione potrebbe essere aggiungere una proprietà come `message.isRead=true`, ma farlo potrebbe essere pericoloso, se questo oggetto viene gestito dal codice di un'altra persona; per evitare conflitti possiamo utilizzare un *symbol*.
2835

2936
Come qui:
3037
```js
31-
// the symbolic property is only known to our code
38+
//la proprietà simbolica è visibile solo al nostro codice
3239
let isRead = Symbol("isRead");
3340
messages[0][isRead] = true;
3441
```
3542

36-
Ora anche se qualcun'altro utilizza `for..in` per avere accesso a tutte le proprietà di messagge, la nostra etichetta sarà segreta.
43+
Ora anche se qualcun altro utilizza `for..in` per avere accesso a tutte le proprietà di messagge, la nostra proprietà sarà segreta.
44+
45+
46+
Although symbols allow to lower the probability of problems, using `WeakSet` is better from the architectural point of view.
47+
Sebbene i simboli permettano una minore probabilità di problemi, utilizzare `weakSet` è meglio da un punto di vista architetturale.

1-js/05-data-types/08-weakmap-weakset/02-recipients-when-read/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ let messages = [
1616

1717
Ora la domanda è: quale struttura di dati converrebbe utilizzare per memorizzare l'informazione: "quando è stato letto il messaggio?".
1818

19-
Nel compito precedente la necessità era semplicemente di memorizzare la lettura del messaggio. Ora abbiamo bisogno di memorizzare anche la data, anche in questo caso, se il messaggio viene eliminato questa dovrebbe sparire.
19+
Nel compito precedente la necessità era semplicemente di memorizzare la lettura del messaggio. Ora abbiamo bisogno di memorizzare anche la data; anche in questo caso, se il messaggio viene eliminato questa dovrebbe sparire.

1-js/05-data-types/08-weakmap-weakset/article.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ john = null; // sovrascriviamo il riferimento
3636
*/!*
3737
```
3838

39-
O, se utilizziamo un oggetto come chiave in un `Map`, fino a che la `Map` esiste, anche l'oggetto esisterà. Occuperà memoria e non potrà essere ripulito dal garbage collector.
39+
O, se utilizziamo un oggetto come chiave in una `Map`, fino a che la `Map` esiste, anche l'oggetto esisterà. Occuperà memoria e non potrà essere ripulito dal garbage collector.
4040

4141
Ad esempio:
4242

@@ -54,7 +54,7 @@ john = null; // sovrascriviamo il riferimento
5454
*/!*
5555
```
5656

57-
`WeakMap` è fondamentalmente diverso sotto questo aspetto. Infatti non previene l'azione del garbage collector sugli oggetti utilizzati come chiave.
57+
`WeakMap` è fondamentalmente diverso sotto questo aspetto. Infatti non previene la garbage-collection degli oggetti utilizzati come chiave.
5858

5959
Vediamo cosa significa questo, utilizzando degli esempi.
6060

@@ -85,12 +85,12 @@ weakMap.set(john, "...");
8585

8686
john = null; // sovrascriviamo il riferimento
8787

88-
// john è stato rimossa dalla memoria!
88+
// john è stato rimosso dalla memoria!
8989
```
9090

91-
Confrontiamolo con l'esempio di `Map` visto sopra. Ora se `john` esiste solo come chiave della `WeakMap` -- verrà eliminato automaticamente dalla map (e anche dalla memoria).
91+
Confrontiamolo con l'esempio di `Map` visto sopra. Ora, se `john` esiste solo come chiave della `WeakMap` -- verrà eliminato automaticamente dalla map (e anche dalla memoria).
9292

93-
`WeakMap` non supporta gli iteratori e i metodi `keys()`, `values()`, `entries()`, quindi non c'è alcun modo di ottenere tutte le chiavi o valori tramite questi metodi.
93+
`WeakMap` non supporta gli iteratori e i metodi `keys()`, `values()`, `entries()`, quindi non c'è alcun modo di ottenere tutte le chiavi o i valori tramite questi metodi.
9494

9595
`WeakMap` possiede solamente i seguenti metodi:
9696

@@ -99,9 +99,9 @@ Confrontiamolo con l'esempio di `Map` visto sopra. Ora se `john` esiste solo com
9999
- `weakMap.delete(key)`
100100
- `weakMap.has(key)`
101101

102-
Perché questa limitazione? Per ragioni tecniche. Se un oggetto ha perso tutti i riferimenti (come `john` nel codice sopra), allora verrà automaticamente eliminato. Ma tecnicamente non è specificato esattamente quando *averrà la pulizia*.
102+
Perché questa limitazione? Per ragioni tecniche. Se un oggetto ha perso tutti i riferimenti (come `john` nel codice sopra), allora verrà automaticamente eliminato. Ma tecnicamente non è specificato esattamente *quando averrà la pulizia*.
103103

104-
Sarà il motore JavaScript a deciderlo. Potrebbe decidere di effettuare subito la pulizia della memoria oppure aspettare più oggetti per eliminarli in blocco. Quindi, tecnicamente il conteggio degli elementi di un `WeakMap` non è conosciuto. Il motore potrebbe già aver effettuato la pulizia oppure no, o averlo fatto solo parzialmente. Per questo motivo, i metodi che accedono a `WeakMap` per intero, non sopo supportati.
104+
Sarà il motore JavaScript a deciderlo. Potrebbe decidere di effettuare subito la pulizia della memoria oppure aspettare più oggetti per eliminarli in blocco. Quindi, tecnicamente il numero degli elementi di una `WeakMap` non è conosciuto. Il motore potrebbe già aver effettuato la pulizia oppure no, o averlo fatto solo parzialmente. Per questo motivo, i metodi che accedono a `WeakMap` per intero non sopo supportati.
105105

106106
Dove potremmo avere bisogno di una struttura simile?
107107

@@ -111,7 +111,7 @@ Il principale campo di applicazione di `WeakMap` è quello di un *additional dat
111111

112112
Se stiamo lavorando con un oggetto che "appartiene" ad un altro codice, magari una libreria di terze parti, e vogliamo memorizzare alcuni dati associati ad esso, che però dovrebbero esistere solamente finché l'oggetto esiste - allora una `WeakMap` è proprio ciò di cui abbiamo bisogno.
113113

114-
Inseriamo i dati in una `WeakMap`, utilizzando l'oggetto come chiave, quando l'oggetto verrà ripulito dal garbage collecetor, anche i dati associati verranno ripuliti.
114+
Inseriamo i dati in una `WeakMap`, utilizzando l'oggetto come chiave; quando l'oggetto verrà ripulito dal garbage collector, anche i dati associati verranno ripuliti.
115115

116116
```js
117117
weakMap.set(john, "secret documents");
@@ -164,11 +164,11 @@ function countUser(user) {
164164
}
165165
```
166166

167-
Ora non dobbiamo più ripulire `visitsCountMap`. Una volta che `john` non è più accessibile, ad eccezione che come chiave della `WeakMap`, viene rimosso dalla memoria, insieme a tutte le informazioni associate contenute nella `WeakMap`.
167+
Ora non dobbiamo più ripulire `visitsCountMap`. Una volta che `john` non sarà più accessibile, ad eccezione che come chiave della `WeakMap`, verrà rimosso dalla memoria, insieme a tutte le informazioni associate contenute nella `WeakMap`.
168168

169169
## Caso d'uso: caching
170170

171-
Un altro caso d'uso comune è il caching. Possiamo memorizzare i risultati di una funzione, cosi che le successive chiamate alla funzione possano riutilizzarli.
171+
Un altro caso d'uso comune è il caching. Possiamo memorizzare i risultati di una funzione, così che le successive chiamate alla funzione possano riutilizzarli.
172172

173173
Per fare questo possiamo utilizzare una `Map` (non la scelta ottimale):
174174

@@ -199,7 +199,7 @@ let result1 = process(obj); // calcolato
199199
// ...più tardi, da un'altra parte del codice...
200200
let result2 = process(obj); // prendiamo il risultato dalla cache
201201

202-
// ...più avanti, quando non avremmo più bisogno dell'oggetto:
202+
// ...più avanti, quando non abbiamo più bisogno dell'oggetto:
203203
obj = null;
204204

205205
alert(cache.size); // 1 (Ouch! L'oggetto è ancora in cache, sta occupando memoria!)
@@ -236,19 +236,19 @@ let result2 = process(obj);
236236
obj = null;
237237

238238
// Non possiamo ottenere la dimensione della cache, poichè è una WeakMap,
239-
// ma o è 0 oppure lo sarà presto
239+
// ma è 0 oppure lo sarà presto
240240
// Quando un oggetto viene ripulito dal garbage collector, anche i dati associati vengono ripuliti
241241
```
242242

243243
## WeakSet
244244

245245
`WeakSet` si comporta in maniera simile:
246246

247-
- E' analogo a `Set`, ma possiamo solamente aggiungere oggetti a `WeakSet` (non primitive).
247+
- E' analogo a `Set`, ma possiamo aggiungere solamente oggetti a `WeakSet` (non primitivi).
248248
- Un oggetto esiste in un set solamente finché rimane accessibile in un altro punto del codice.
249249
- Come `Set`, supporta `add`, `has` e `delete`, ma non `size`, `keys()` e nemmeno gli iteratori.
250250

251-
Il fatto che sia "weak", la rende utile come spazio di archiviazione aggiuntivo. Non per dati arbitrari, ma piuttosto per questioni di tipo "si/no". Il fatto di appartenere ad un `WeakSet` può aggiungere significato all'oggetto.
251+
Il fatto che sia "weak" la rende utile come spazio di archiviazione aggiuntivo. Non per dati arbitrari, ma piuttosto per questioni di tipo "si/no". Il fatto di appartenere ad un `WeakSet` può significare qualcosa sull'oggetto.
252252

253253
Ad esempio, possiamo aggiungere gli utenti ad un `WeakSet` per tenere traccia di chi ha visitato il nostro sito:
254254

@@ -280,7 +280,7 @@ La maggior limitazione di `WeakMap` e `WeakSet` è l'assenza di iteratori, e la
280280

281281
## Riepilogo
282282

283-
`WeakMap` è una collezione simile a `Map`, che permette di utilizzare solamente gli oggetti come chiave, con la differenza che la rimozione di un oggetto, rimuove anche il valore associato.
283+
`WeakMap` è una collezione simile a `Map`, ma permette di utilizzare solamente oggetti come chiavi; inoltre, la rimozione di un oggetto rimuove anche il valore associato.
284284

285285
`WeakSet` è una collezione simile a `Set`, che memorizza solamente oggetti, e li rimuove completamente una volta che diventano inaccessibili.
286286

0 commit comments

Comments
 (0)