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/02-first-steps/12-nullish-coalescing-operator/article.md
+28-29Lines changed: 28 additions & 29 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,18 +2,17 @@
2
2
3
3
[recent browser="new"]
4
4
5
-
Qui, in questo articolo, diremo che un'espressione è "definita" quando non è né `null` né `undefined`.
6
-
7
-
Il nullish coalescing operator è scritto come due punti di domanda `??`.
5
+
Il *nullish coalescing operator* è rappresentato da due punti di domanda `??`.
8
6
9
7
Il risultato di `a ?? b` è:
10
8
- se `a` è definito, allora `a`,
11
9
- se `a` non è definito, allora `b`.
12
10
11
+
(In questo articolo, diremo che un'espressione è "definita" quando non è né `null` né `undefined`.)
13
12
14
-
In altre parole, `??` ritorna il primo argomento se questo non è `null/undefined`. Altrimenti, ritorna il secondo.
13
+
In altre parole, tra due operatori `??` ritorna il primo se questo non è `null/undefined`; altrimenti, ritorna il secondo.
15
14
16
-
Il nullish coalescing operator non è qualcosa di completamente nuovo. È solo un modo più elegante (una migliore sintassi) per recuperare il primo valore "definito" dei due.
15
+
Il nullish coalescing operator non è qualcosa di completamente nuovo. È solo un modo più elegante per recuperare il primo valore "definito" tra due operatori.
17
16
18
17
Possiamo riscrivere `result = a ?? b` usando gli operatori che già conosciamo, nel seguente modo:
19
18
@@ -41,18 +40,18 @@ alert(user ?? "Anonymous"); // John
41
40
42
41
Possiamo anche usare una sequenza di `??` per selezionare, da una lista, il primo valore che non sia `null/undefined`.
43
42
44
-
Per esempio, supponiamo di avere dei dati relativi ad un utente nelle variabili `firstName`, `lastName` o `nickName`. Tutte queste potrebbero essere non definite, se l'utente dovesse decidere di non inserirne i valori.
43
+
Per esempio, supponiamo di avere i dati di un utente nelle variabili `firstName`, `lastName` o `nickName`. Tutte queste potrebbero essere non definite, se l'utente dovesse decidere di non inserirne i valori.
45
44
46
-
Vorremmo visualizzare il nome dell'utente usando una di queste variabili, oppure mostrare "Anonymous" se tutte queste sono indefinite.
45
+
Vorremmo visualizzare il nome dell'utente usando una di queste variabili, oppure mostrare "Anonymous" se nessuna di esse è definita.
L'operatore OR `||` esiste sin dagli inizi di JavaScript, quindi gli sviluppatori lo hanno usato a tale scopo per molto tempo.
77
+
L'operatore OR `||` esiste sin dagli inizi di JavaScript e gli sviluppatori lo hanno usato a tale scopo per molto tempo.
79
78
80
-
D'altro canto, il nullish coalescing operator `??` fu aggiunto in JavaScript recentemente, poichè le persone non erano del tutto felici dell'operatore `||`.
79
+
Il nullish coalescing operator `??`, invece, è stato aggiunto recentemente. La ragione è che alcuni sviluppatori non erano del tutto contenti dell'operatore `||`.
81
80
82
81
L'importante differenza tra essi è la seguente:
83
82
- `||` ritorna il primo valore *truthy*.
84
83
- `??` ritorna il primo valore *definito*.
85
84
86
-
In altre parole, `||` non distingue tra `false`, `0`, una stringa vuota `""` e `null/undefined`. Sono tutti, allo stesso modo -- valori "falsy". Se uno tra questi è il primo argomento di `||`, allora otterremo il secondo argomento come risultato.
85
+
In altre parole, `||` non distingue tra `false`, `0`, una stringa vuota `""` e `null/undefined`. In contesto booleano sono tutti valori `false`. Se uno di questi è il primo argomento di `||`, verrà ritornato il secondo argomento.
87
86
88
-
In pratica, però, potremmo voler usare il valore di default solamente quando la variabile è `null/undefined`. È in questo caso che il valore è davvero sconosciuto/non settato.
87
+
In pratica, però, potremmo voler usare il valore di default solamente quando la variabile è `null/undefined`. Ovvero quando è veramente non definita: una stringa vuota `''` o `0`, ad esempio, potrebbero tornarci utili.
89
88
90
-
Per esempio, consideriamo questo:
89
+
Per esempio, consideriamo il seguente codice:
91
90
92
91
```js run
93
92
let height =0;
@@ -96,24 +95,24 @@ alert(height || 100); // 100
96
95
alert(height ??100); // 0
97
96
```
98
97
99
-
- `height ||100` controlla se `height`possiede un valore "falsy", ed effettivamente così è,
100
-
- quindi il risultato è il secondo argomento, `100`.
101
-
- `height ??100` controlla se `height` è `null/undefined`, ma così non è,
102
-
- quindi il risultato è `height` "così com'è", ovvero `0`.
98
+
- `height ||100` controlla se `height`ha un valore falso: così è.
99
+
- il risultato è dunque il secondo argomento, `100`.
100
+
- `height ??100` controlla se `height` è `null/undefined`: non lo è.
101
+
- quindi il risultato è `height`, ovvero `0`.
103
102
104
-
Se un'altezza pari a zero è un valore accettabile, allora questo non dovrebbe essere rimpiazzato con il valore di default, quindi `??`fa la cosa giusta.
103
+
Se un'altezza pari a zero è un valore accettabile, questo non dovrebbe essere rimpiazzato con il valore di default (il secondo operatore, nel'esempio sopra `100`); in questo caso il *nullish coalescing operator* `??`è la scelta giusta.
105
104
106
105
## Precedenza
107
106
108
-
La precedenza dell'operatore `??` è piuttosto bassa: `5` nella [MDN table](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table). Quindi `??` è valutato prima di `=` e `?`, ma dopo la maggior parte degli altri operatori, come `+`,`*`.
107
+
La precedenza dell'operatore `??` è piuttosto bassa: `5` nella [MDN table](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table). Quindi `??` è valutato prima di `=` e `?`, ma dopo la maggior parte degli altri operatori, come `+` o`*`.
109
108
110
109
Quindi, se volessimo scegliere un valore tramite l'operatore `??` in un'espressione contenente altri operatori, dovremmo considerare l'utilizzo delle parentesi:
111
110
112
111
```js run
113
112
let height =null;
114
113
let width =null;
115
114
116
-
//important: use parentheses
115
+
//importante: utilizzare le parentesi
117
116
let area = (height ??100) * (width ??50);
118
117
119
118
alert(area); // 5000
@@ -122,24 +121,24 @@ alert(area); // 5000
122
121
Altrimenti, se omettessimo le parentesi, siccome `*` ha una precedenza maggiore rispetto a `??`, sarebbe eseguito prima, portando a risultati scorretti.
123
122
124
123
```js
125
-
//without parentheses
124
+
//senza parentesi
126
125
let area = height ??100* width ??50;
127
126
128
-
// ...works the same as this (probably not what we want):
127
+
// ...funziona allo stesso modo del seguente codice (probabilmente non ciò che vogliamo)
129
128
let area = height ?? (100* width) ??50;
130
129
```
131
130
132
131
### Usare ?? con && o ||
133
132
134
133
Per motivi di sicurezza, JavaScript proibisce l'utilizzo di `??` insieme agli operatori `&&` e `||`, a meno che la precedenza non sia esplicitamente specificata tramite l'utilizzo delle parentesi.
135
134
136
-
Il codice sottostante causa un errore di sintassi:
135
+
Il codice sotto causa un errore di sintassi:
137
136
138
137
```js run
139
138
let x =1&&2??3; // Syntax error
140
139
```
141
140
142
-
La limitazione è sicuramente discutibile, ma fu aggiunta alle specifiche del linguaggio con lo scopo di evitare errori di programmazione nel momento in cui le persone hanno iniziato ad utilizzare `??` al posto di `||`.
141
+
La limitazione è sicuramente discutibile, ma fu aggiunta alle specifiche del linguaggio -quando le persone hanno iniziato ad utilizzare `??` al posto di `||`- con lo scopo di evitare errori di programmazione.
143
142
144
143
Per aggirare il problema si possono utilizzare delle parentesi esplicite:
145
144
@@ -151,16 +150,16 @@ let x = (1 && 2) ?? 3; // Works
151
150
alert(x); // 2
152
151
```
153
152
154
-
## Sommario
153
+
## Riepilogo
155
154
156
155
- Il nullish coalescing operator `??` fornisce una scorciatoia per la scelta del primo valore "definito" da una lista di valori.
157
156
158
157
È usato per assegnare valori di default alle variabili:
159
158
160
159
```js
161
-
//set height=100, if height is null or undefined
160
+
// imposta height = 100 se 'height' è *null* o *undefined*
162
161
height = height ??100;
163
162
```
164
163
165
-
- L'operatore `??` ha una precedenza molto bassa, solo un po' più alta di `?` e `=`, quindi considerare l'aggiunta di parentesi quando lo si utilizza all'interno di un'espressione.
164
+
- L'operatore `??` ha una precedenza molto bassa, solo un po' più alta di `?` e `=`, quindi va considerata l'aggiunta di parentesi quando lo si utilizza all'interno di un'espressione.
166
165
- È proibito usarlo con `||` o `&&` senza l'utilizzo di parentesi esplicite.
Copy file name to clipboardExpand all lines: 1-js/02-first-steps/14-switch/2-rewrite-if-switch/solution.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,4 +1,4 @@
1
-
I primi due controlli vengono trasmormati in due `case`. Il terzo controllo viene diviso in due casi:
1
+
I primi due controlli vengono trasformati in due `case` separati. Il terzo controllo viene diviso in due `case` raggruppati:
2
2
3
3
```js run
4
4
let a =+prompt('a?', '');
@@ -23,4 +23,4 @@ switch (a) {
23
23
24
24
Da notare: il `break` alla fine non è richiesto. Lo abbiamo messo per rendere il codice pronto ad aggiornamenti futuri.
25
25
26
-
In futuro, potremmo voler aggiungere un ulteriore `case`, ad esempio `case 4`. E se ci dimentichiamo di aggiungere il break prima di scrivere il nuovo case, al termine del `case 3` ci sarà un errore. Quindi aggiungere il break è una sorta di auto-certezza.
26
+
In futuro, potremmo voler aggiungere un ulteriore `case`, ad esempio `case 4`. E se ci dimentichiamo di aggiungere il `break` prima di scrivere il nuovo `case`, al termine del `case 3` ci sarà un errore. Quindi aggiungere il `break` è una sorta di prevenzione.
Copy file name to clipboardExpand all lines: 1-js/02-first-steps/14-switch/article.md
+18-17Lines changed: 18 additions & 17 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,14 +1,14 @@
1
1
# L'istruzione "switch"
2
2
3
-
L'istruzione `switch` può essere utile per rimpiazzare `if` multipli.
3
+
L'istruzione `switch` può essere utile per rimpiazzare multipli `if`.
4
4
5
-
E' infatti un metodo molto più descrittivo per confrontare un valore che può assumere più varianti.
5
+
E' infatti un metodo molto più descrittivo per lavorare con un elemento che può avere svariati valori.
6
6
7
7
## La sintassi
8
8
9
-
Un istruzione `switch` possiede uno o più `case` ed opzionalmente un blocco default.
9
+
Un istruzione `switch` possiede uno o più `case` ed opzionalmente un blocco *default*.
10
10
11
-
Appare cosi:
11
+
Un esempio:
12
12
13
13
```js no-beautify
14
14
switch(x) {
@@ -26,9 +26,9 @@ switch(x) {
26
26
}
27
27
```
28
28
29
-
- Il valore di `x` viene controllato utilizzando l'uguaglianza stretta con il valore fornito dal primo blocco `case` (che è, `value1`) poi dal secondo (`value2`) e avanti cosi.
29
+
- Il valore di `x` viene controllato utilizzando l'uguaglianza stretta con i valori dei blocchi `case` (`value1` e `value2` nell'esempio sopra).
30
30
- Se l'uguaglianza viene trovata, `switch` inizia ad eseguire il codice partendo dal corrispondente blocco `case`, fino al `break` più vicino (oppure fino alla fine dello `switch`).
31
-
- Se non viene trovata nessuna uguaglianza allora viene eseguito il codice del blocco `default` (se questo è presente).
31
+
- Se non viene trovata nessuna uguaglianza allora viene eseguito il codice del blocco `default` (se presente).
32
32
33
33
## Un esempio
34
34
@@ -54,11 +54,11 @@ switch (a) {
54
54
}
55
55
```
56
56
57
-
Qui lo `switch` inizia confrontando `a` con il primo `case`, la sua variante è `3`. Quindi il match fallisce.
57
+
Qui lo `switch` inizia confrontando `a` con il primo `case`, il cui valore è `3`. Non vi è corrispondenza.
58
58
59
-
Poi valuta `4`. Questo è un match riuscito, quindi l'esecuzione inizia da `case 4` fino al `break` più vicino.
59
+
Poi valuta `4`. C'è una corrispondenza, quindi l'esecuzione inizia da `case 4` fino al `break` più vicino.
60
60
61
-
**Se non c'è nessun `break` l'esecuzione procede al prossimo `case` senza alcun controllo.**
61
+
**Se non c'è nessun `break` l'esecuzione procede al prossimo `case`.**
62
62
63
63
Un esempio senza `break`:
64
64
@@ -79,7 +79,7 @@ switch (a) {
79
79
}
80
80
```
81
81
82
-
Nell'esempio sopra abbiamo visto l'esecuzione sequenziale dei tre `alert`:
82
+
Nell'esempio sopra, non essendoci un `break`, abbiamo l'esecuzione sequenziale dei tre `alert`:
83
83
84
84
```js
85
85
alert( 'Exactly!' );
@@ -107,12 +107,13 @@ switch (+a) {
107
107
alert("this doesn't run");
108
108
}
109
109
```
110
-
Qui `+a` viene convertito in `1`, che viene confrontato con `b + 1` nei `case`, ed il codice corrispondente viene eseguito.
111
-
````
110
+
```
111
+
Qui `+a` viene convertito in `1`, che nei `case` viene confrontato con `b + 1`, ed il codice corrispondente viene eseguito.
112
+
```
112
113
113
114
## Raggruppare i "case"
114
115
115
-
Diverse varianti di `case` che condividono lo stesso codice possono essere raggruppate.
116
+
Possiamo raggruppare diverse varianti di `case`e far loro eseguire lo stesso codice.
116
117
117
118
Ad esempio, se vogliamo eseguire lo stesso codice per `case 3` e `case 5`:
118
119
@@ -139,11 +140,11 @@ switch (a) {
139
140
140
141
Ora sia `3` che `5` mostreranno lo stesso messaggio.
141
142
142
-
L'abilità di "raggruppare" più case è un effetto collaterale di come `switch/case` funziona senza `break`. Qui l'esecuzione del case `case 3` inizia dalla linea `(*)` e prosegue fino a `case 5`, perchè non c'è alcun `break`.
143
+
L'abilità di "raggruppare" più `case` è un effetto collaterale di come `switch/case` funziona senza `break`. Qui l'esecuzione del `case 3` inizia dalla linea `(*)` e prosegue fino a `case 5`, perché non c'è alcun `break`.
143
144
144
145
## Il tipo conta
145
146
146
-
Mettiamo in risalto che il confronto di uguaglianza è sempre stretto. I valori devono essere dello stesso tipo perchè si possa avere un match.
147
+
Mettiamo in risalto che il confronto di uguaglianza è sempre stretto. I valori devono essere dello stesso tipo perché si possa avere una corrispondenza.
147
148
148
149
Ad esempio, consideriamo il codice:
149
150
@@ -167,6 +168,6 @@ switch (arg) {
167
168
}
168
169
```
169
170
170
-
1. Per `0`, `1`, viene eseguito il primo `alert`.
171
+
1. Per `0` e`1`, viene eseguito il primo `alert`.
171
172
2. Per `2` viene eseguito il secondo `alert`.
172
-
3. Ma per `3`, il risultato del `prompt` è una stringa `"3"`, che non è strettamente uguale `===` al numero `3`. Quindi qui abbiamo del codice morto in `case 3`! Verrà quindi eseguita la variante `default`.
173
+
3.Per `3`, il risultato del `prompt` è una stringa,`"3"`, che non è strettamente uguale `===` al numero `3`. Quindi abbiamo del codice 'morto' nel `case 3`! Verrà quindi eseguito il codice dentro`default`.
0 commit comments