Skip to content

Commit f17f17e

Browse files
authored
Merge pull request #181 from Dorin-David/article/11-logical-operators
Logical operators
2 parents f34ddaf + c6a51aa commit f17f17e

File tree

11 files changed

+65
-74
lines changed

11 files changed

+65
-74
lines changed

1-js/02-first-steps/11-logical-operators/1-alert-null-2-undefined/task.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ importance: 5
22

33
---
44

5-
# Qual'e il risultato dell'OR?
5+
# Qual è il risultato dell'OR?
66

7-
Che risultato restituirà il codice qui sotto?
7+
Quale sarà il risultato del codice sotto?
88

99
```js
1010
alert( null || 2 || undefined );

1-js/02-first-steps/11-logical-operators/2-alert-or/solution.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ La risposta: prima `1`, poi `2`.
44
alert( alert(1) || 2 || alert(3) );
55
```
66

7-
La chiamata ad `alert` non ritorna alcun valore. In altre parole, ritorna `undefined`.
7+
La chiamata ad `alert` non ritorna alcun valore; ossia `undefined`.
88

9-
1. Il primo OR `||` valuta il suo operando sinistro `alert(1)`. Questo mostra il primo messaggio con `1`.
10-
2. La funzione `alert` ritorna `undefined`, quindi OR prosegue con il secondo operando alla ricerca di un valore vero.
9+
1. Il primo OR `||` valuta l'operando sinistro `alert(1)`. Questo mostra il primo messaggio, `1`.
10+
2. La funzione `alert` ritorna `undefined`, quindi OR prosegue con il secondo operando, alla ricerca di un valore vero.
1111
3. Il secondo operando `2` è vero; quindi l'esecuzione si ferma, viene ritornato `2` e mostrato dall'alert esterno.
1212

1313
Non ci sarà il `3`, perchè la valutazione non arriva a `alert(3)`.

1-js/02-first-steps/11-logical-operators/2-alert-or/task.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ importance: 3
22

33
---
44

5-
# Qual'è il risultato dell'alert con l'OR?
5+
# Qual è il risultato dell'alert con l'OR?
66

7-
Cosa stampa il codice qui sotto?
7+
Cosa mostrerà il codice sotto?
88

99
```js
1010
alert( alert(1) || 2 || alert(3) );

1-js/02-first-steps/11-logical-operators/3-alert-1-null-2/task.md

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

33
---
44

5-
# Qual'è il risultato dell'AND?
5+
# Qual è il risultato dell'AND?
66

77
Cosa mostrerà l'esecuzione di questo codice?
88

1-js/02-first-steps/11-logical-operators/4-alert-and/solution.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ La risposta è: `1`, e poi `undefined`.
44
alert( alert(1) && alert(2) );
55
```
66

7-
La chiamata `alert` ritorna `undefined` (mostra solo un messaggio, quindi non ha nessuna valore di ritorno significativo).
7+
La chiamata `alert` ritorna `undefined` (mostra solo un messaggio, quindi non ha nessuna valore significativo di ritorno).
88

9-
Per questo `&&` valuta l'operando di sinistra (che mostra `1`), e si ferma immediatamente, perchè `undefined` è un valore falso. AND `&&` cerca un valore falso e lo ritorna.
9+
Per questo `&&`, valutato l'operando di sinistra (che mostra `1`), si ferma: `undefined` è un valore falso e `&&` lo ritorna immediatamente.
1010

1-js/02-first-steps/11-logical-operators/4-alert-and/task.md

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

33
---
44

5-
# Qual'è il risultato degli alert?
5+
# Qual è il risultato degli alert?
66

77
Cosa mostrerà questo codice?
88

1-js/02-first-steps/11-logical-operators/7-check-if-out-range/task.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ importance: 3
22

33
---
44

5-
# Controlla l'intervallo esternamente
5+
# Controlla l'intervallo fuori
66

7-
Scrivi una condizione `if` che controlli la variabile `age`, questa NON deve essere compresa tra `14` e `90`, estremi inclusi.
7+
Scrivi una condizione `if` che controlli la variabile `age`; questa NON deve essere compresa tra `14` e `90` (inclusi).
88

99
Scrivi due varianti: la prima utilizzando NOT `!`, la seconda -- senza.

1-js/02-first-steps/11-logical-operators/8-if-question/solution.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@ La risposta: il primo e il terzo verranno eseguiti.
33
I dettagli:
44

55
```js run
6-
// Runs.
7-
// The result of -1 || 0 = -1, truthy
6+
// Viene eseguito
7+
// Il risultato di -1 || 0 = -1 è vero
88
if (-1 || 0) alert( 'first' );
99

10-
// Doesn't run
11-
// -1 && 0 = 0, falsy
10+
// Non viene eseguito
11+
// -1 && 0 = 0, falso
1212
if (-1 && 0) alert( 'second' );
1313

14-
// Executes
15-
// Operator && has a higher precedence than ||
16-
// so -1 && 1 executes first, giving us the chain:
14+
// Eseguito
15+
// L'operatore && ha la precedenza su ||,
16+
// quindi -1 && 1 vengono eseguiti per primi; la catena dentro `if` diventa:
1717
// null || -1 && 1 -> null || 1 -> 1
1818
if (null || -1 && 1) alert( 'third' );
1919
```

1-js/02-first-steps/11-logical-operators/8-if-question/task.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ importance: 5
22

33
---
44

5-
# Una indovinello con "if"
5+
# Un indovinello con "if"
66

77
Quali di questi `alert` verranno eseguiti?
88

9-
Quale sarà il risultato dell'espressione all'interno di `if(...)`?
9+
Quale sarà il risultato delle espressioni all'interno dei vari `if(...)`?
1010

1111
```js
1212
if (-1 || 0) alert( 'first' );

1-js/02-first-steps/11-logical-operators/9-check-login/task.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,20 @@ importance: 3
66

77
Scrivi il codice che richiede un login tramite `prompt`.
88

9-
Se l'utente digita `"Admin"`, allora si richiede una password tramite `prompt`, se l'input è una stringa vuota o `key:Esc` -- mostra "Canceled.", se invece è un'altra stringa -- allora mostra "I don't know you".
9+
Se l'utente digita `"Admin"`, si richiede una password tramite `prompt`; se l'input è una stringa vuota o `key:Esc` -- mostra "Canceled."; se è diversa da `"Admin"`, mostra "I don't know you".
1010

11-
La passoword viene controllata con le seguenti regole:
11+
La passoword viene controllata secondo i seguenti criteri:
1212

13-
- Se è uguale a "TheMaster", allora mostra "Welcome!",
14-
- Un'altra stringa -- mostra "Wrong password",
15-
- Per una stringa vuota o `key:Esc`, mostra "Canceled."
13+
- Se è uguale a "TheMaster", mostra "Welcome!",
14+
- Un stringa diversa da "TheMaster" -- mostra "Wrong password",
15+
- Una stringa vuota o `key:Esc` -- mostra "Canceled."
1616

1717
Lo schema:
1818

1919
![](ifelse_task.svg)
2020

21-
Utilizzate blocchi `if` annidati. Tenete a mente anche la leggibilità del codice.
21+
Utilizza blocchi `if` annidati e tieni a mente la leggibilità del codice.
2222

23-
Suggerimento: passare un input vuoto tramite prompt ritorna una stringa vuota `''`. Premere `key:ESC` con prompt aperto ritorna `null`.
23+
Suggerimento: passare un input vuoto tramite prompt ritorna una stringa vuota `''`. Premere `key:ESC` metre il prompt è aperto ritorna `null`.
2424

2525
[demo]

1-js/02-first-steps/11-logical-operators/article.md

Lines changed: 36 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# Operatori logici
22

3-
In JavaScript ci sono tre operatori logici: `||` (OR), `&&` (AND), `!` (NOT).
3+
In JavaScript ci sono tre operatori logici: `||` (OR), `&&` (AND), e `!` (NOT).
44

5-
Nonostante si chiamino "logici", possono essere applicati a valori di qualsiasi tipo, non solo ai booleani. Il risultato stesso può essere di qualunque tipo.
5+
Nonostante si chiamino "logici", possono essere applicati a valori di qualsiasi tipo, non solo ai booleani (i risultati stessi possono essere di qualunque tipo).
66

77
Vediamoli nei dettagli.
88

@@ -14,9 +14,9 @@ L'operatore "OR" viene rappresentato da due linee verticali:
1414
result = a || b;
1515
```
1616

17-
Nella programmazione classica, l'OR logico è pensato per manipolare solo tipi booleani. Se almeno un argomento è `true`, allora il risultato sarà `true`, altrimenti sarà `false`.
17+
Nella programmazione classica, l'OR logico è utilizzato per manipolare solo tipi booleani. Se almeno un argomento è `true`, allora il risultato sarà `true`, altrimenti sarà `false`.
1818

19-
In JavaScript questo operatore è un più potente. Ma prima guardiamo come si comporta con valori booleani.
19+
In JavaScript questo operatore è un po' più potente. Ma prima vediamo come si comporta con i valori booleani.
2020

2121
Ci sono quattro combinazioni logiche possibili:
2222

@@ -27,11 +27,11 @@ alert( true || false ); // true
2727
alert( false || false ); // false
2828
```
2929

30-
Come possiamo vedere, il risultato è sempre `true` tranne nei casi in cui entrambi gli operandi sono `false`.
30+
Come possiamo vedere, il risultato è sempre `true`, tranne nei casi in cui entrambi gli operandi sono `false`.
3131

32-
Se un operando non è booleano, allora viene convertito in booleano per essere valutato.
32+
Se un operando non è di tipo booleano, allora viene momentaneamente convertito per la valutazione.
3333

34-
Ad esempio, il numero `1` viene visto come `true`, il numero `0` -- come `false`:
34+
Ad esempio, il numero `1` viene considerato come `true`, il numero `0` come `false`:
3535

3636
```js run
3737
if (1 || 0) { // funziona proprio come ( true || false )
@@ -60,17 +60,17 @@ let hour = 12;
6060
let isWeekend = true;
6161

6262
if (hour < 10 || hour > 18 || isWeekend) {
63-
alert( 'The office is closed.' ); // è il fine settimana
63+
alert( 'The office is closed.' ); // l'Ufficio è chiuso
6464
}
6565
```
6666

6767
## OR "||" trova il primo valore vero
6868

6969
La logica descritta sopra è ovvia. Adesso proviamo ad addentrarci in qualche caratteristica "extra" di JavaScript.
7070

71-
Si può estendere l'algoritmo come segue:
71+
Si può estendere l'algoritmo come segue.
7272

73-
Dando molti valori tramite OR:
73+
Dati svariati operandi:
7474

7575
```js
7676
result = value1 || value2 || value3;
@@ -79,12 +79,12 @@ result = value1 || value2 || value3;
7979
L'operatore OR `||` si comporta come segue:
8080

8181
- Valuta gli operandi da sinistra a destra.
82-
- Ogni operando viene converito in booleano. Se il risultato è `true`, allora si ferma e ritorna il valore originale dell'operando.
83-
- Se tutti gli altri operandi sono stati valutati (ad esempio tutti erano `false`), ritorna l'ultimo operando.
82+
- Ogni operando viene convertito a booleano. Se il risultato è `true`, il logical OR si ferma e ritorna il valore originale dell'operando.
83+
- Se tutti gli operandi sono stati valutati e nessuno è `true`, ritorna l'ultimo operando.
8484

8585
Un valore viene ritornato nella sua forma originale, non nella sua conversione booleana.
8686

87-
In altra parole, una catena di OR `"||"` ritorna il primo valore vero, se invece non ce ne sono ritorna l'ultimo valore trovato.
87+
In altre parole, una catena di OR `"||"` ritorna il primo valore vero; se invece non ce ne sono ritorna l'ultimo valore.
8888

8989
Ad esempio:
9090

@@ -97,13 +97,13 @@ alert( null || 0 || 1 ); // 1 (il primo valore true)
9797
alert( undefined || null || 0 ); // 0 (tutti falsi, ritorna l'ultimo valore)
9898
```
9999

100-
Questo ci porta ad alcuni utilizzi interessanti rispetto al "puro e classico OR booleano".boolean-only OR".
100+
Questo ci permette alcuni utilizzi interessanti rispetto al "puro e classico OR booleano"boolean-only OR".
101101

102-
1. **Prelevare il primo valore vero da una lista di variabili o espressioni.**
102+
1. **Trovare il primo valore vero in una lista di variabili o espressioni.**
103103

104-
Immaginiamo di avere diverse variabili, `firstName`, `lastName` e `nickName`, tutti opzionali (possono quindi essere undefined o avere valori falsi).
104+
Immaginiamo di avere diverse variabili, `firstName`, `lastName` e `nickName`, tutte opzionali (possono quindi essere *undefined* o avere valori falsi).
105105

106-
Possiamo utilizzare OR `||` per selezionare quello che contiene il valore e mostrarlo (oppure mostrare `"Anonymous"` se nessun valore è settato):
106+
Possiamo utilizzare OR `||` per selezionare quella che contiene un valore e mostrarlo (oppure mostrare `"Anonymous"` se nessua variabile è definita):
107107

108108
```js run
109109
let firstName = "";
@@ -119,27 +119,17 @@ Questo ci porta ad alcuni utilizzi interessanti rispetto al "puro e classico OR
119119

120120
2. **Valutazione a Corto-Circuito.**
121121

122-
Gli operandi, oltre che valori, possono essere anche espressioni arbitrarie. OR valuta ed esegue i test da sinistra a destra. La valutazione si ferma al primo risultato vero, questo viene poi ritornato. Il processo è chiamato "valutazione a corto-circuito", perchè cerca di terminare il prima possibile partendo da sinistra verso destra.
122+
Gli operandi, oltre che valori, possono essere anche espressioni arbitrarie. L'operatore OR esegue la valutazione da sinistra a destra e si ferma al primo risultato vero, il quale viene ritornato. Il processo è chiamato "valutazione a corto-circuito" perché cerca di concludersi il prima possibile, senza dover elaborare tutti gli operandi.
123123
124-
Questo si vede chiaramente quando il secondo argomento causerebbe side-effect. Come l'assegnazione di una variabile.
125-
126-
Se proviamo ad eseguire l'esempio che segue, `x` non verrà assegnata:
127-
128-
alert(x); // undefined, perché (x = 1) non viene valutato
129-
```
130-
131-
Se invece il primo argomento è `false`, allora `||` prosegue e valuta il secondo, in questo caso l'assegnazione funziona:
124+
Il logical OR è particolarmente utile quando il secondo argomento causerebbe un *side-effect* come l'assegnazione di una variabile o la chiamata a una funzione.
125+
Nell'esempio che segue solo il secondo messaggio verrà mostrato.
132126
133127
```js run no-beautify
134128
*!*true*/!* || alert("not printed");
135129
*!*false*/!* || alert("printed");
136130
```
137-
138-
Un'assegnazione è un caso semplice. Potrebbero essere coinvolti altri tipi di side-effect.
139-
140-
Quello che abbiamo visto, è un "modo breve di fare `if`". Il primo operando viene convertito a booleano e solo se è falso viene eseguito il secondo.
141-
142-
La maggior parte delle volte è meglio utilizzare un " `if` "regolare", per mantenere il codice leggibile, in alcuni casi però può risultare utile.
131+
Nella prima linea l'operatore OR trova subito un valore vero e ferma immediatamente la valutazione, quindi *alert* non viene eseguito.
132+
Si può utilizzare questa funzionalità per eseguire un commando nel caso in cui la prima parte della condizione sia falsa.
143133

144134
## && (AND)
145135

@@ -178,9 +168,9 @@ if (1 && 0) { // valutato come true && false
178168
```
179169
180170
181-
## AND "&& trova il primo valore falso
171+
## AND "&&" trova il primo valore falso
182172
183-
Fornire più valori AND:
173+
Dati svariati operandi:
184174
185175
```js
186176
result = value1 && value2 && value3;
@@ -189,12 +179,12 @@ result = value1 && value2 && value3;
189179
L'operatore AND `&&` si comporta come segue:
190180
191181
- Valuta gli operandi da sinistra a destra.
192-
- Ogni operando viene convertito in booleano. Se il risultato è `false`, si ferma e ritorna il valore originale dell'operando.
193-
- Se tutti gli operandi precedenti sono stati valutati (ad esempio nel caso siano tutti veri) , ritorna l'ultimo operando.
182+
- Ogni operando viene convertito a booleano. Se il risultato è `false`, si ferma e ritorna il valore originale dell'operando.
183+
- Se tutti gli operandi precedenti sono stati valutati e nessuno è `false`, ritorna l'ultimo operando.
194184
195-
In altre parole, AND ritorna il primo valore falso se lo trova, altrimenti ritorna l'ultimo valore.
185+
In altre parole, AND ritorna il primo valore falso, altrimenti ritorna l'ultimo valore.
196186
197-
Le regole sono molto simili a quelle dell'OR. La differenza è che AND ritorna il primo valore *falso* mentre OR ritorna il primo valore *VERO*.
187+
Le regole sono molto simili a quelle dell'OR. La differenza è che AND ritorna il primo valore *falso* mentre OR ritorna il primo valore *vero*.
198188
199189
Esempi:
200190
@@ -210,7 +200,7 @@ alert( null && 5 ); // null
210200
alert( 0 && "no matter what" ); // 0
211201
```
212202
213-
Possiamo anche passare diversi valori in una sola riga. Vediamo come viene ritornato il primo valore falso:
203+
Possiamo anche passare diversi valori in una sola riga. Nota come il primo valore falso viene ritornato non appena raggiunto:
214204
215205
```js run
216206
alert( 1 && 2 && null && 3 ); // null
@@ -225,7 +215,7 @@ alert( 1 && 2 && 3 ); // 3, l'ultimo
225215
````smart header="Precedenza di AND `&&` è maggiore dell'OR `||`"
226216
La precedenza dell'operatore AND `&&` è maggiore di quella dell'OR `||`.
227217
228-
Quindi il codice `a && b || c && d` esegue in maniera analoga all'espressione: `(a && b) || (c && d)`.
218+
Quindi il codice `a && b || c && d` è analogo all'espressione: `(a && b) || (c && d)`.
229219
````
230220

231221
````warn header="Non rimpiazzate `if` con `||` o `&&`"
@@ -242,7 +232,7 @@ let x = 1;
242232
243233
Le azioni nella parte destra di `&&` vengono eseguite solamente se la valutazione non si ferma prima. Cioè: solo se `(x > 0)` è vera.
244234
245-
Quindi sostanzialmente è analogo a:
235+
Il codie sopra è sostanzialmente analogo a:
246236
247237
```js run
248238
let x = 1;
@@ -253,6 +243,7 @@ if (x > 0) alert( 'Greater than zero!' );
253243
La variante con `&&` sembra essere più corta. Ma l'istruzione `if` è più ovvia e tende ad essere più leggibile.
254244
255245
Quindi è consigliato usare ogni costrutto solo per i suoi scopi. Usate un `if` se volete imporre una condizione. Utilizzate invece `&&` se volete un AND.
246+
````
256247
257248
## ! (NOT)
258249
@@ -266,7 +257,7 @@ result = !value;
266257
267258
L'operatore accetta un solo argomento e si comporta come segue:
268259
269-
1. Converte l'operando al tipo booleano: `true/false`.
260+
1. Converte l'operando a booleano: `true/false`.
270261
2. Ritorna il valore inverso.
271262
272263
Ad esempio:
@@ -283,13 +274,13 @@ alert( !!"non-empty string" ); // true
283274
alert( !!null ); // false
284275
```
285276
286-
Quello che accade è che il primo NOT converte il tipo a booleano e ritorna il suo inverso, il secondo NOT lo inverte nuovamente. Alla fine abbiamo un valore di tipo booleano.
277+
Quello che accade è che il primo NOT converte l'operando a booleano e ritorna il suo inverso, e il secondo NOT lo *inverte nuovamente*. Il risultato è un valore di tipo booleano.
287278
288-
C'è un modo molto più lungo per fare la stessa cosa -- una funzione del linguaggio `Boolean`:
279+
C'è un modo molto più lungo per fare la stessa cosa, usare la funzione `Boolean`, integrata in JavaScript:
289280
290281
```js run
291282
alert( Boolean("non-empty string") ); // true
292283
alert( Boolean(null) ); // false
293284
```
294285
295-
La precedenza del NOT `!` è la più alta fra tutti gli operatori logici quindi viene sempre eseguita per prima, precede `&&`, `||`.
286+
La precedenza del NOT `!` è la più alta fra tutti gli operatori logici; viene sempre eseguita per prima e precede sia `&&` che `||`.

0 commit comments

Comments
 (0)