Skip to content

Logical operators #181

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 24 commits into from
Jan 24, 2021
Merged
Changes from 1 commit
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
e8e2276
Update article.md
Dorin-David Jan 21, 2021
b9df73b
Update article.md
Dorin-David Jan 21, 2021
f80fb36
Update article.md
Dorin-David Jan 22, 2021
a45abf0
Update task.md
Dorin-David Jan 22, 2021
fb58982
Update task.md
Dorin-David Jan 22, 2021
aff5e39
Update solution.md
Dorin-David Jan 22, 2021
f70d723
Update task.md
Dorin-David Jan 22, 2021
7f20acf
Update task.md
Dorin-David Jan 22, 2021
ba54fbf
Update solution.md
Dorin-David Jan 22, 2021
d5bafd0
Update task.md
Dorin-David Jan 22, 2021
3b38b4d
Update article.md
pasor1 Jan 22, 2021
4da1550
Merge pull request #2 from pasor1/patch-1
Dorin-David Jan 22, 2021
cf4680a
Update task.md
Dorin-David Jan 22, 2021
d9a93b9
Update task.md
Dorin-David Jan 22, 2021
698314b
Update task.md
Dorin-David Jan 22, 2021
27587d1
Update 1-js/02-first-steps/11-logical-operators/2-alert-or/solution.md
Dorin-David Jan 23, 2021
f92c0cb
Update 1-js/02-first-steps/11-logical-operators/article.md
Dorin-David Jan 23, 2021
1a39e5f
Update 1-js/02-first-steps/11-logical-operators/article.md
Dorin-David Jan 23, 2021
803368d
Update 1-js/02-first-steps/11-logical-operators/article.md
Dorin-David Jan 23, 2021
9930428
Update 1-js/02-first-steps/11-logical-operators/article.md
Dorin-David Jan 23, 2021
e2c97bd
Update 1-js/02-first-steps/11-logical-operators/article.md
Dorin-David Jan 23, 2021
b54fa5a
Update 1-js/02-first-steps/11-logical-operators/article.md
Dorin-David Jan 24, 2021
f25f2a6
Update task.md
Dorin-David Jan 24, 2021
c6a51aa
Update solution.md
Dorin-David Jan 24, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Update article.md
  • Loading branch information
Dorin-David authored Jan 21, 2021
commit b9df73bccfec832d63fedb35793fabc42a1d4c16
38 changes: 14 additions & 24 deletions 1-js/02-first-steps/11-logical-operators/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

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

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

Vediamoli nei dettagli.

Expand All @@ -14,7 +14,7 @@ L'operatore "OR" viene rappresentato da due linee verticali:
result = a || b;
```

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

In JavaScript questo operatore è un pò più potente. Ma prima vediamo come si comporta con i valori booleani.

Expand All @@ -27,9 +27,9 @@ alert( true || false ); // true
alert( false || false ); // false
```

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

Se un operando non è booleano viene convertito per essere valutato.
Se un operando non è di tipo booleano vi viene momentaneamente convertito per la valutazione.

Ad esempio, il numero `1` viene considerato come `true`, il numero `0` come `false`:

Expand Down Expand Up @@ -60,7 +60,7 @@ let hour = 12;
let isWeekend = true;

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

Expand All @@ -79,12 +79,12 @@ result = value1 || value2 || value3;
L'operatore OR `||` si comporta come segue:

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

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

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

Ad esempio:

Expand All @@ -99,7 +99,7 @@ alert( undefined || null || 0 ); // 0 (tutti falsi, ritorna l'ultimo valore)

Questo ci permette alcuni utilizzi interessanti rispetto al "puro e classico OR booleano"boolean-only OR".

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

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

Expand All @@ -119,27 +119,17 @@ Questo ci permette alcuni utilizzi interessanti rispetto al "puro e classico OR

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

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, che viene ritornato. Il processo è chiamato "valutazione a corto-circuito" perchè cerca di concludersi il prima possibile (quando possibile), senza aver toccato l’operando successivo.
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, che viene ritornato. Il processo è chiamato "valutazione a corto-circuito" perchè cerca di concludersi il prima possibile (quando possibile), senza aver raggiunto l’operando successivo.

Questo si nota chiaramente quando il secondo argomento causerebbe un *side-effect* come l'assegnazione di una variabile o una function call.

Se proviamo ad eseguire l'esempio che segue, `x` non verrà assegnata:

alert(x); // undefined, perché (x = 1) non viene valutato
```

Se invece il primo argomento è `false`, allora `||` prosegue e valuta il secondo, in questo caso l'assegnazione funziona:
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.
Nell'esempio che segue solo il secondo messaggio verrà mostrato.

```js run no-beautify
*!*true*/!* || alert("not printed");
*!*false*/!* || alert("printed");
```

Un'assegnazione è un caso semplice. Potrebbero essere coinvolti altri tipi di side-effect.

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.

La maggior parte delle volte è meglio utilizzare un " `if` "regolare", per mantenere il codice leggibile, in alcuni casi però può risultare utile.
Nella prima linea l'operatore OR trova subito un valore vero e ferma immediatamente la valutazione, quindi *alert* non viene eseguito.
Si può utilizzare questa funzionalità per eseguire un commando nel caso in cui la prima parte della condizione sia falsa.

## && (AND)

Expand Down