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
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/02-object-copy/article.md
+11-11Lines changed: 11 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -35,15 +35,15 @@ Ed ecco come viene effettivamente archiviata in memoria:
35
35
36
36

37
37
38
-
L'oggetto è archiviato da qualche parte nella memoria (sulla destra dell'immagine), mentre la variabile `user` (sulla sinistra) contiene il "riferimento" ad esso.
38
+
L'oggetto è archiviato da qualche parte nella memoria (a destra nell'immagine), mentre la variabile `user` (a sinistra) contiene il "riferimento" ad esso.
39
39
40
40
Potremmo immaginare la variabile oggetto `user`, come un foglio di carta con scritto l'indirizzo dell'oggetto.
41
41
42
42
Quando eseguiamo azioni con l'oggetto, ad es. leggere una proprietà `user.name`, il motore JavaScript guarda cosa c'è a quell'indirizzo ed esegue l'operazione sull'oggetto reale.
43
43
44
44
Ecco perché è così importante.
45
45
46
-
**Quando una variabile oggetto viene copiata, in realtà viene copiato il riferimento, ma l'oggetto in sé non viene duplicato.**
46
+
**Quando una "variabile oggetto" viene copiata, in realtà viene copiato il riferimento, ma l'oggetto in sé non viene duplicato.**
47
47
48
48
Esempio:
49
49
@@ -89,7 +89,7 @@ alert( a == b ); // true, entrambe le variabili si riferiscono allo stesso ogget
89
89
alert( a === b ); // true
90
90
```
91
91
92
-
Qui, invece, due oggetti identici (entrambi vuoti) ma indipendenti, non soddisfano l'uguaglianza:
92
+
Qui, invece, due oggetti identici (entrambi vuoti), ma indipendenti, non soddisfano l'uguaglianza:
93
93
94
94
95
95
```js run
@@ -107,7 +107,7 @@ Come abbiamo detto, copiare una variabile oggetto crea un ulteriore riferimento
107
107
108
108
Quindi, come possiamo fare se abbiamo bisogno di duplicare un oggetto? Creare una copia indipendente, un clone?
109
109
110
-
Anche questo è fattibile, ma con un po' di difficoltà visto che JavaScript non integra alcun metodo per farlo. In realtà non è un'operazione frequente, il più delle volte la copia per riferimento è adatta alla situazione.
110
+
Anche questo è fattibile, ma con un po' di difficoltà visto che JavaScript non ha alcun metodo integrato per farlo. In realtà non è un'operazione frequente, il più delle volte la copia per riferimento è adatta alla situazione.
111
111
112
112
Ma se proprio ne abbiamo bisogno, allora dobbiamo creare un nuovo oggetto e replicare la struttura di quello esistente iterando le sue proprietà
113
113
e copiandole a livello primitivo.
@@ -123,7 +123,7 @@ let user = {
123
123
*!*
124
124
let clone = {}; // il nuovo oggetto vuoto
125
125
126
-
// copiamo in clone tutte le proprietà di user
126
+
// copiamo nella variabile clone tutte le proprietà di user
- Il primo argomento `dest` è l'oggetto di destinazione.
147
-
- Gli argomenti successivi `src1, ..., srcN` (possono essere quanti vogliamo) sono gli oggetti sorgente.
148
-
- Il metodo copia tutte le proprietà degli oggetti sorgente `src1, ..., srcN` in quello di destinazione `dest`.
147
+
- Gli argomenti successivi `src1, ..., srcN` (possono essere quanti vogliamo) sono gli oggetti da copiare.
148
+
- Il metodo copia tutte le proprietà degli oggetti `src1, ..., srcN` in quello di destinazione `dest`.
149
149
- Viene restituito l'oggetto `dest`.
150
150
151
151
Per fare un esempio, possiamo unire diversi oggetti in uno solo:
@@ -187,7 +187,7 @@ let clone = Object.assign({}, user);
187
187
*/!*
188
188
```
189
189
190
-
Vengono copiate tutte le proprietà di `user` nell'oggetto vuoto, quindi esso viene restituito.
190
+
Vengono copiate tutte le proprietà di `user` nell'oggetto vuoto, il quale, poi, viene restituito.
191
191
192
192
## Clonazione nidificata
193
193
@@ -229,11 +229,11 @@ user.sizes.width++; // cambiamo una proprietà da una parte
229
229
alert(clone.sizes.width); // 51, e vediamo il risultato dall'altra
230
230
```
231
231
232
-
Per correggere questo problema, dobbiamo usare un ciclo di clonazioni che esaminerà ogni valore di `user[key]` e, nel caso sia un oggetto, replichi anche la sua struttura. Questa operazione è chiamata "deep cloning" (copia profonda).
232
+
Per risolvere questo problema, dobbiamo usare un ciclo di clonazioni che esaminerà ogni valore di `user[key]` e, nel caso sia un oggetto, replichi anche la sua struttura. Questa operazione è chiamata "deep cloning" (copia profonda).
233
233
234
234
Per implementare questa funzione possiamo usare la ricorsione. Oppure, per non reinventare la ruota, possiamo usare qualcosa di già pronto, ad esempio [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) dalla libreria JavaScript [lodash](https://lodash.com).
235
235
236
-
````smart header="Gli oggetti dichiarati con Const possono essere modificati"
236
+
````smart header="Gli oggetti dichiarati con const possono essere modificati"
237
237
Un importante "side effect" della memorizzazione per riferimento è che un oggetto dichiarato con `const` *può* esseremodificato.
238
238
239
239
Esempio:
@@ -252,7 +252,7 @@ alert(user.name); // Pete
252
252
253
253
Saremmo portati a pensare che la linea `(*)` causi un errore, ma non è così. Il valore di `user` è costante, si riferisce sempre allo stesso oggetto, ma le proprietà dell'oggetto sono libere di cambiare.
254
254
255
-
In altre parole, `const user` restituisce un errore solo se se proviamo a riassegnare del tutto `user=...`.
255
+
In altre parole, `const user` restituisce un errore solo se se proviamo a riassegnare in toto `user=...`.
256
256
257
257
Detto questo, se vogliamo veramente rendere invariabili le proprietà di un oggetto, possiamo farlo, ma con un metodo totalmente differente. Ne parleremo nel capitolo <info:property-descriptors>.
0 commit comments