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
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.
48
48
49
-
Ad esempio, proviamo ad ottenere`user.address.street.name`.
49
+
Ad esempio, proviamo a recuperare il valore di`user.address.street.name`.
50
50
51
51
Dobbiamo verificare sia `user.address` che `user.address.street`:
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.
70
70
71
71
Come potete vedere, il nome della proprietà è ancora duplicato nel codice. Ad esempio, nel codice sopra, `user.address` è ripetuto tre volte.
72
72
73
73
Questo è il motivo per cui la concatenazione opzionale `?.`, è stata aggiunta al linguaggio. Per risolvere questo problema una volta per tutte!
74
74
75
75
## Concatenazione opzionale
76
76
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`.
78
78
79
79
**D'ora in poi in questo articolo, per brevità, diremo che qualcosa "esiste" se non è ne `null` né `undefined`.**
Da notare: la sintassi `?.` rende opzionale il valore che la precede, nulla di più.
105
105
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 `?.`.
107
107
108
108
```warn header="Non abusate della concatenazione opzionale"
109
109
Dovremmo utilizzare `?.` solamente quando va bene che una proprietà possa non esistere.
110
110
111
111
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`.
112
112
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.
114
114
```
115
115
116
116
````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:
118
118
119
119
```js run
120
120
// ReferenceError: user is not defined
@@ -125,9 +125,9 @@ La variabile deve essere dichiarata (ad esempio come `let/const/var user` o come
125
125
126
126
## Corto circuito
127
127
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.
129
129
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.
131
131
132
132
Ad esempio:
133
133
@@ -166,11 +166,11 @@ userGuest.admin?.(); // niente (il metodo non esiste)
166
166
*/!*
167
167
```
168
168
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.
170
170
171
171
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.
172
172
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.
174
174
175
175
```js run
176
176
let key ="firstName";
@@ -209,8 +209,8 @@ Non è cosi intelligente.
209
209
210
210
La concatenazione opzionale `?.` possiede tre forme:
211
211
212
-
1. `obj?.prop` -- ritorna `obj.prop` se `obj` esiste, altrimenti `undefined`.
213
-
2. `obj?.[prop]` -- ritorna `obj[prop]` se `obj` esiste, altrimenti `undefined`.
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