You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// now readMessages has 1 element (technically memory may be cleaned later)
25
+
//ora readMessages ha un elemento (tecnicamente la memoria potrebbe essere ripulita dopo)
21
26
```
22
27
23
28
La struttura `WeakSet` consente di memorizzare un insieme di messaggi e di verificare molto rapidamente la presenza di un dato messaggio.
24
29
25
30
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.
26
31
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*.
28
35
29
36
Come qui:
30
37
```js
31
-
// the symbolic property is only known to our code
38
+
//la proprietà simbolica è visibile solo al nostro codice
32
39
let isRead =Symbol("isRead");
33
40
messages[0][isRead] =true;
34
41
```
35
42
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.
Copy file name to clipboardExpand all lines: 1-js/05-data-types/08-weakmap-weakset/02-recipients-when-read/task.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -16,4 +16,4 @@ let messages = [
16
16
17
17
Ora la domanda è: quale struttura di dati converrebbe utilizzare per memorizzare l'informazione: "quando è stato letto il messaggio?".
18
18
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.
Copy file name to clipboardExpand all lines: 1-js/05-data-types/08-weakmap-weakset/article.md
+15-15Lines changed: 15 additions & 15 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -36,7 +36,7 @@ john = null; // sovrascriviamo il riferimento
36
36
*/!*
37
37
```
38
38
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.
40
40
41
41
Ad esempio:
42
42
@@ -54,7 +54,7 @@ john = null; // sovrascriviamo il riferimento
54
54
*/!*
55
55
```
56
56
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.
58
58
59
59
Vediamo cosa significa questo, utilizzando degli esempi.
60
60
@@ -85,12 +85,12 @@ weakMap.set(john, "...");
85
85
86
86
john =null; // sovrascriviamo il riferimento
87
87
88
-
// john è stato rimossa dalla memoria!
88
+
// john è stato rimosso dalla memoria!
89
89
```
90
90
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).
92
92
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.
94
94
95
95
`WeakMap` possiede solamente i seguenti metodi:
96
96
@@ -99,9 +99,9 @@ Confrontiamolo con l'esempio di `Map` visto sopra. Ora se `john` esiste solo com
99
99
-`weakMap.delete(key)`
100
100
-`weakMap.has(key)`
101
101
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*.
103
103
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.
105
105
106
106
Dove potremmo avere bisogno di una struttura simile?
107
107
@@ -111,7 +111,7 @@ Il principale campo di applicazione di `WeakMap` è quello di un *additional dat
111
111
112
112
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.
113
113
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.
115
115
116
116
```js
117
117
weakMap.set(john, "secret documents");
@@ -164,11 +164,11 @@ function countUser(user) {
164
164
}
165
165
```
166
166
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`.
168
168
169
169
## Caso d'uso: caching
170
170
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.
172
172
173
173
Per fare questo possiamo utilizzare una `Map` (non la scelta ottimale):
174
174
@@ -199,7 +199,7 @@ let result1 = process(obj); // calcolato
199
199
// ...più tardi, da un'altra parte del codice...
200
200
let result2 =process(obj); // prendiamo il risultato dalla cache
201
201
202
-
// ...più avanti, quando non avremmo più bisogno dell'oggetto:
202
+
// ...più avanti, quando non abbiamo più bisogno dell'oggetto:
203
203
obj =null;
204
204
205
205
alert(cache.size); // 1 (Ouch! L'oggetto è ancora in cache, sta occupando memoria!)
@@ -236,19 +236,19 @@ let result2 = process(obj);
236
236
obj =null;
237
237
238
238
// 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
240
240
// Quando un oggetto viene ripulito dal garbage collector, anche i dati associati vengono ripuliti
241
241
```
242
242
243
243
## WeakSet
244
244
245
245
`WeakSet` si comporta in maniera simile:
246
246
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).
248
248
- Un oggetto esiste in un set solamente finché rimane accessibile in un altro punto del codice.
249
249
- Come `Set`, supporta `add`, `has` e `delete`, ma non `size`, `keys()` e nemmeno gli iteratori.
250
250
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.
252
252
253
253
Ad esempio, possiamo aggiungere gli utenti ad un `WeakSet` per tenere traccia di chi ha visitato il nostro sito:
254
254
@@ -280,7 +280,7 @@ La maggior limitazione di `WeakMap` e `WeakSet` è l'assenza di iteratori, e la
280
280
281
281
## Riepilogo
282
282
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.
284
284
285
285
`WeakSet` è una collezione simile a `Set`, che memorizza solamente oggetti, e li rimuove completamente una volta che diventano inaccessibili.
0 commit comments