Skip to content

Commit c848885

Browse files
longo-andreapasor1
andauthored
Apply suggestions from code review
Co-authored-by: Simone Pasini <66781510+pasor1@users.noreply.github.com>
1 parent 5d4a521 commit c848885

File tree

1 file changed

+14
-14
lines changed
  • 1-js/04-object-basics/07-optional-chaining

1 file changed

+14
-14
lines changed

1-js/04-object-basics/07-optional-chaining/article.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ let user = {};
4444
alert(user.address ? user.address.street : undefined);
4545
```
4646

47-
Funziona, nessun errore... Ma è poco elegante. Come potete vedere , `"user.address"` appare due volte nel codice. Per proprietà molto più annidate, potrebbe diventare un problema, in quanto ci saranno molte più ripetizioni.
47+
Funziona, nessun errore... Ma è poco elegante. Come potete vedere , `"user.address"` appare due volte nel codice. Per proprietà molto più annidate, potrebbe diventare un problema, in quanto saranno necessarie molte più ripetizioni.
4848

49-
Ad esempio, proviamo ad ottenere `user.address.street.name`.
49+
Ad esempio, proviamo a recuperare il valore di `user.address.street.name`.
5050

5151
Dobbiamo verificare sia `user.address` che `user.address.street`:
5252

@@ -58,23 +58,23 @@ alert(user.address ? user.address.street ? user.address.street.name : null : nul
5858

5959
Questo è semplicemente terribile, un codice del genere potrebbe anche essere difficile da comprendere.
6060

61-
Non ha importanza, c'è un modo migliore per riscriverlo, utilizzando l'operatore `&&`:
61+
Ci sarebbe un modo migliore per riscriverlo, utilizzando l'operatore `&&`:
6262

6363
```js run
6464
let user = {}; // l'utente non ha address
6565

6666
alert( user.address && user.address.street && user.address.street.name ); // undefined (nessune errore)
6767
```
6868

69-
Concatenare con `&&` l'intero percorso verso la proprietà ci assicura che tutti i componenti esistano (in caso contrario, la valutazione si interrompe), ma non è comunque ideal.
69+
Concatenare con `&&` l'intero percorso verso la proprietà ci assicura che tutti i componenti esistano (in caso contrario, la valutazione si interrompe), ma non è comunque l'ideale.
7070

7171
Come potete vedere, il nome della proprietà è ancora duplicato nel codice. Ad esempio, nel codice sopra, `user.address` è ripetuto tre volte.
7272

7373
Questo è il motivo per cui la concatenazione opzionale `?.`, è stata aggiunta al linguaggio. Per risolvere questo problema una volta per tutte!
7474

7575
## Concatenazione opzionale
7676

77-
La concatenazione opzionale `?.` interrompe al valutazione se il valore prima di `?.` è `undefined` o `null`, e ritorna `undefined`.
77+
La concatenazione opzionale `?.` interrompe la valutazione se il valore prima di `?.` è `undefined` o `null`, e ritorna `undefined`.
7878

7979
**D'ora in poi in questo articolo, per brevità, diremo che qualcosa "esiste" se non è ne `null``undefined`.**
8080

@@ -103,18 +103,18 @@ alert( user?.address.street ); // undefined
103103
104104
Da notare: la sintassi `?.` rende opzionale il valore che la precede, nulla di più.
105105
106-
Ad esempio in `user?.address.street.name` il costrutto `?.` permette alla proprietà `user` di essere `null/undefined` in sicurezza (e ritornare `undefined` in questo caso), ma questo vale solamente per `user`. Le altre proprietà verranno accedute normalmente. Se vogliamo che anche altre proprietà siano opzionali, dobbiamo rimpiazzare `.` con `?.`.
106+
Ad esempio in `user?.address.street.name` il costrutto `?.` permette alla proprietà `user` di essere `null/undefined` in sicurezza (e ritornare `undefined` in questo caso), ma questo vale solamente per `user`. Si accederà alle altre proprietà normalmente. Se vogliamo che anche altre proprietà siano opzionali, dobbiamo rimpiazzare `.` con `?.`.
107107
108108
```warn header="Non abusate della concatenazione opzionale"
109109
Dovremmo utilizzare `?.` solamente quando va bene che una proprietà possa non esistere.
110110

111111
Ad esempio, guardando la logica del nostro codice, l'oggetto `user` deve necessariamente esistere, mentre `address` è opzionale, quindi dovremmo scrivere `user.address?.street`, non `user?.address?.street`.
112112
113-
Quindi, se `user` dovesse essere `undefined` per errore, otterremo un errore e potremmo sistemarlo. Altrimenti, gli errori di programmazione possono essere silenziati in modo non appropriati, rendendo il debug molto difficile.
113+
Quindi, se `user` dovesse essere `undefined` per errore, otterremo un errore e potremmo sistemarlo. Altrimenti, gli errori di programmazione potrebbero essere silenziati in modo non appropriato, rendendo il debug molto difficile.
114114
```
115115
116116
````warn header="La variabile che precede `?.` deve essere dichiarata"
117-
Se non esiste alcuna variabile `user`, allora `user?.anything` lancerà un errore:
117+
Se non esiste alcuna variabile `user`, allora `user?.anything` provocherà un errore:
118118
119119
```js run
120120
// ReferenceError: user is not defined
@@ -125,9 +125,9 @@ La variabile deve essere dichiarata (ad esempio come `let/const/var user` o come
125125
126126
## Corto circuito
127127
128-
Come detto in precedenza, il costrutto `?.` interrompe immediatamente (va in "corto circuito") la valutazione, se la proprietà a destra non esiste.
128+
Come detto in precedenza, il costrutto `?.` interrompe immediatamente (manda in "corto circuito") la valutazione, se la proprietà a destra non esiste.
129129
130-
Quindi, nel caso ci siano ulteriori chiamate a funzione o side-effect, questi non avverranno.
130+
Quindi, nel caso ci siano ulteriori chiamate a funzione o side-effects, questi non verranno elaborati.
131131
132132
Ad esempio:
133133
@@ -166,11 +166,11 @@ userGuest.admin?.(); // niente (il metodo non esiste)
166166
*/!*
167167
```
168168
169-
Qui, in entrambe le righe come prima cosa abbiamo utilizzato il punto (`user1.admin`) per ottenere la proprietà `admin`, poiché l'oggetto `user` deve necessariamente esistere, quindi l'accesso è sicuro.
169+
Qui, in entrambe le righe, come prima cosa abbiamo utilizzato il punto (`user1.admin`) per ottenere la proprietà `admin`, poiché l'oggetto `user` deve necessariamente esistere, quindi l'accesso è sicuro.
170170
171171
Successivamente `?.()` controlla la parte sinistra: se la funzione `admin` esiste, allora viene eseguita (ciò che accade con `user1`). Altrimenti (con `user2`) la valutazione si interrompe senza errori.
172172
173-
Anche la funzione `?.[]` funziona, se volessimo usare le parentesi `[]` per accedere alle proprietà, invece del punto `.`. In maniera simile ai casi precedenti, potremmo accedere con sicurezza ad una proprietà di un oggetto, che potrebbe non esistere.
173+
La sintassi `?.[]` funziona anche se volessimo usare le parentesi `[]` per accedere alle proprietà, invece del punto `.`. In maniera simile ai casi precedenti, potremmo accedere con sicurezza ad una proprietà di un oggetto, che potrebbe non esistere.
174174
175175
```js run
176176
let key = "firstName";
@@ -209,8 +209,8 @@ Non è cosi intelligente.
209209
210210
La concatenazione opzionale `?.` possiede tre forme:
211211
212-
1. `obj?.prop` -- ritorna `obj.prop` se `obj` esiste, altrimenti `undefined`.
213-
2. `obj?.[prop]` -- ritorna `obj[prop]` se `obj` esiste, altrimenti `undefined`.
212+
1. `obj?.prop` -- ritorna `obj.prop` se `obj` esiste, altrimenti ritorna `undefined`.
213+
2. `obj?.[prop]` -- ritorna `obj[prop]` se `obj` esiste, altrimenti ritorna `undefined`.
214214
3. `obj.method?.()` -- invoca `obj.method()` se `obj.method` esiste, altrimenti ritorna `undefined`.
215215
216216
Come possiamo vedere, le tre forme sono semplici da utilizzare. Il costrutto `?.` verifica che la parte sinistra non sia `null/undefined` e permette alla valutazione di proseguire in caso contrario.

0 commit comments

Comments
 (0)