Skip to content

Commit b73a5c5

Browse files
committed
2 parents d2f312b + ef5f201 commit b73a5c5

File tree

6 files changed

+93
-93
lines changed

6 files changed

+93
-93
lines changed

1-js/02-first-steps/12-nullish-coalescing-operator/article.md

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,17 @@
22

33
[recent browser="new"]
44

5-
Qui, in questo articolo, diremo che un'espressione è "definita" quando non è né `null``undefined`.
6-
7-
Il nullish coalescing operator è scritto come due punti di domanda `??`.
5+
Il *nullish coalescing operator* è rappresentato da due punti di domanda `??`.
86

97
Il risultato di `a ?? b` è:
108
- se `a` è definito, allora `a`,
119
- se `a` non è definito, allora `b`.
1210

11+
(In questo articolo, diremo che un'espressione è "definita" quando non è né `null``undefined`.)
1312

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.
1514

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.
1716

1817
Possiamo riscrivere `result = a ?? b` usando gli operatori che già conosciamo, nel seguente modo:
1918

@@ -41,18 +40,18 @@ alert(user ?? "Anonymous"); // John
4140
4241
Possiamo anche usare una sequenza di `??` per selezionare, da una lista, il primo valore che non sia `null/undefined`.
4342
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.
4544
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.
4746
48-
Usiamo l'operatore `??`per questo:
47+
Usiamo l'operatore `??`:
4948
5049
```js run
5150
let firstName = null;
5251
let lastName = null;
5352
let nickName = "Supercoder";
5453

55-
// shows the first defined value:
54+
// mostra il primo valore valido:
5655
*!*
5756
alert(firstName ?? lastName ?? nickName ?? "Anonymous"); // Supercoder
5857
*/!*
@@ -69,25 +68,25 @@ let firstName = null;
6968
let lastName = null;
7069
let nickName = "Supercoder";
7170

72-
// shows the first truthy value:
71+
// mostra il primo valore vero:
7372
*!*
7473
alert(firstName || lastName || nickName || "Anonymous"); // Supercoder
7574
*/!*
7675
```
7776
78-
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.
7978
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 `||`.
8180
8281
L'importante differenza tra essi è la seguente:
8382
- `||` ritorna il primo valore *truthy*.
8483
- `??` ritorna il primo valore *definito*.
8584
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.
8786
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.
8988
90-
Per esempio, consideriamo questo:
89+
Per esempio, consideriamo il seguente codice:
9190
9291
```js run
9392
let height = 0;
@@ -96,24 +95,24 @@ alert(height || 100); // 100
9695
alert(height ?? 100); // 0
9796
```
9897
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`.
103102
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.
105104
106105
## Precedenza
107106
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 `*`.
109108
110109
Quindi, se volessimo scegliere un valore tramite l'operatore `??` in un'espressione contenente altri operatori, dovremmo considerare l'utilizzo delle parentesi:
111110
112111
```js run
113112
let height = null;
114113
let width = null;
115114

116-
// important: use parentheses
115+
// importante: utilizzare le parentesi
117116
let area = (height ?? 100) * (width ?? 50);
118117

119118
alert(area); // 5000
@@ -122,24 +121,24 @@ alert(area); // 5000
122121
Altrimenti, se omettessimo le parentesi, siccome `*` ha una precedenza maggiore rispetto a `??`, sarebbe eseguito prima, portando a risultati scorretti.
123122
124123
```js
125-
// without parentheses
124+
// senza parentesi
126125
let area = height ?? 100 * width ?? 50;
127126

128-
// ...works the same as this (probably not what we want):
127+
// ...funziona allo stesso modo del seguente codice (probabilmente non ciò che vogliamo)
129128
let area = height ?? (100 * width) ?? 50;
130129
```
131130
132131
### Usare ?? con && o ||
133132
134133
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.
135134
136-
Il codice sottostante causa un errore di sintassi:
135+
Il codice sotto causa un errore di sintassi:
137136
138137
```js run
139138
let x = 1 && 2 ?? 3; // Syntax error
140139
```
141140
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.
143142
144143
Per aggirare il problema si possono utilizzare delle parentesi esplicite:
145144
@@ -151,16 +150,16 @@ let x = (1 && 2) ?? 3; // Works
151150
alert(x); // 2
152151
```
153152
154-
## Sommario
153+
## Riepilogo
155154
156155
- Il nullish coalescing operator `??` fornisce una scorciatoia per la scelta del primo valore "definito" da una lista di valori.
157156
158157
È usato per assegnare valori di default alle variabili:
159158
160159
```js
161-
// set height=100, if height is null or undefined
160+
// imposta height = 100 se 'height' è *null* o *undefined*
162161
height = height ?? 100;
163162
```
164163
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.
166165
- È proibito usarlo con `||` o `&&` senza l'utilizzo di parentesi esplicite.

1-js/02-first-steps/14-switch/1-rewrite-switch-if-else/solution.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
Per ottener un match preciso con il costrutto `switch`, `if` deve utilizzare l'uguaglianza stretta `'==='`.
1+
Per ottenere una corrispondenza precisa con il costrutto `switch`, `if` deve utilizzare l'uguaglianza stretta `'==='`.
22

3-
Per le stringhe fornite, un semplice `'=='` può bastare.
3+
Per le stringhe fornite, tuttavia, un semplice `'=='` può bastare.
44

55
```js no-beautify
66
if(browser == 'Edge') {

1-js/02-first-steps/14-switch/2-rewrite-if-switch/solution.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff 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:
22

33
```js run
44
let a = +prompt('a?', '');
@@ -23,4 +23,4 @@ switch (a) {
2323

2424
Da notare: il `break` alla fine non è richiesto. Lo abbiamo messo per rendere il codice pronto ad aggiornamenti futuri.
2525

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.

1-js/02-first-steps/14-switch/2-rewrite-if-switch/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ importance: 4
22

33
---
44

5-
# Riscrivi "if" con "switch"
5+
# Riscrivi "if" utilizzando "switch"
66

77
Riscrivi il codice sotto utilizzando un singolo `switch`:
88

1-js/02-first-steps/14-switch/article.md

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
# L'istruzione "switch"
22

3-
L'istruzione `switch` può essere utile per rimpiazzare `if` multipli.
3+
L'istruzione `switch` può essere utile per rimpiazzare multipli `if`.
44

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.
66

77
## La sintassi
88

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*.
1010

11-
Appare cosi:
11+
Un esempio:
1212

1313
```js no-beautify
1414
switch(x) {
@@ -26,9 +26,9 @@ switch(x) {
2626
}
2727
```
2828

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).
3030
- 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).
3232

3333
## Un esempio
3434

@@ -54,11 +54,11 @@ switch (a) {
5454
}
5555
```
5656

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.
5858

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.
6060

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`.**
6262

6363
Un esempio senza `break`:
6464

@@ -79,7 +79,7 @@ switch (a) {
7979
}
8080
```
8181

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`:
8383

8484
```js
8585
alert( 'Exactly!' );
@@ -107,12 +107,13 @@ switch (+a) {
107107
alert("this doesn't run");
108108
}
109109
```
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+
```
112113

113114
## Raggruppare i "case"
114115

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.
116117

117118
Ad esempio, se vogliamo eseguire lo stesso codice per `case 3` e `case 5`:
118119

@@ -139,11 +140,11 @@ switch (a) {
139140

140141
Ora sia `3` che `5` mostreranno lo stesso messaggio.
141142

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`.
143144

144145
## Il tipo conta
145146

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.
147148

148149
Ad esempio, consideriamo il codice:
149150

@@ -167,6 +168,6 @@ switch (arg) {
167168
}
168169
```
169170

170-
1. Per `0`, `1`, viene eseguito il primo `alert`.
171+
1. Per `0` e `1`, viene eseguito il primo `alert`.
171172
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

Comments
 (0)