Skip to content

Commit a7935d5

Browse files
authored
Merge pull request #151 from pasor1/article/09-comparison
Corretto ed aggiornato articolo ed esercizi 02/09-comparison
2 parents 42d55f6 + a50d752 commit a7935d5

File tree

3 files changed

+57
-55
lines changed

3 files changed

+57
-55
lines changed

1-js/02-first-steps/09-comparison/1-comparison-questions/solution.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ null === +"\n0\n" → false
1212

1313
I motivi:
1414

15-
1. Ovviamente vale true.
16-
2. Confronto lessico-grafico, quindi false.
17-
3. Nuovamente, confronto lessico-grafico, il primo carattere di `"2"` è maggiore del primo carattere `"1"`.
15+
1. Ovviamente è true.
16+
2. Confronto lessicografico, quindi false.
17+
3. Nuovamente, confronto lessicografico, il primo carattere di `"2"` è maggiore del primo carattere `"1"`.
1818
4. I valori `null` e `undefined` sono uguali solo tra di loro.
1919
5. L'uguaglianza stretta è stretta. I tipi differenti dei due operandi portano ad un risultato false.
2020
6. Vedi `(4)`, `null` equivale solamente a `undefined`..

1-js/02-first-steps/09-comparison/1-comparison-questions/task.md

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

55
# Confronti
66

7-
Qual'è il risultato di queste espressioni?
7+
Quale sarà il risultato di queste espressioni?
88

99
```js no-beautify
1010
5 > 4
Lines changed: 53 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
# Confronti
22

3-
Molti operatori di confronto li conosciamo già dalla matematica:
3+
Molti operatori di confronto già li conosciamo dalla matematica:
44

5-
- Maggiore/minore di: <code>a &gt; b</code>, <code>a &lt; b</code>.
6-
- Maggiore/minore o uguale di: <code>a &gt;= b</code>, <code>a &lt;= b</code>.
7-
- L'uguaglianza viene scritta come `a == b` (da notare che si utilizza due volte il simbolo `=`. Il simbolo unico`a = b` significa assegnazione).
8-
- Non uguale. In matematica la notazione è <code>&ne;</code>, in JavaScript viene scritto come un'assegnazione ma con un punto esclamativo davanti: <code>a != b</code>.
5+
- Maggiore/minore: <code>a &gt; b</code>, <code>a &lt; b</code>.
6+
- Maggiore/minore o uguale: <code>a &gt;= b</code>, <code>a &lt;= b</code>.
7+
- Uguaglianza: `a == b` (da notare che il doppio simbolo `=` indica un test di uguaglianza, mentre il simbolo unico `a = b` rappresenta un' assegnazione).
8+
- Disuguaglianza. In matematica la notazione è <code>&ne;</code>, mentre in JavaScript viene scritto come <code>a != b</code>.
9+
10+
In questo articolo impareremo più approfonditamente i vari tipi di confronto, come vengono gestiti in JavaScript, incluse alcune importanti peculiarità
911

1012
## Il risultato è booleano
1113

12-
Come tutti gli altri operatori, quelli di confronto ritornano un valore. In questo caso il valore di ritorno è di tipo booleano.
14+
Tutti gli operatori di confronto restituiscono un valore booleano.
1315

1416
- `true` -- significa "si", "corretto" o "vero".
1517
- `false` -- significa "no", "sbagliato" o "falso".
@@ -31,9 +33,9 @@ alert( result ); // true
3133

3234
## Confronto di stringhe
3335

34-
Per vedere quale stringa è più lunga di un'altra, viene utilizzato l'ordine "dizionario" o meglio "lessico-grafico".
36+
Per vedere quale stringa è maggiore di un'altra, viene utilizzato il cosiddetto ordine "dizionario" o "lessicografico".
3537

36-
In altre parole, le stringhe vengono confrontate lettera a lettera.
38+
In altre parole, le stringhe vengono confrontate lettera per lettera.
3739

3840
Ad esempio:
3941

@@ -45,24 +47,24 @@ alert( 'Bee' > 'Be' ); // true
4547

4648
L'algoritmo per confrontare due stringhe è semplice:
4749

48-
1. Confronta i primi caratteri di entrambe le stringhe.
49-
2. Se il primo è maggiore(o minore), allora la prima stringa è maggiore(o minore) della seconda. Abbiamo quindi finito.
50-
3. Altrimenti se i primi caratteri sono uguali, vengono comparati i secondi, nella stessa maniera.
50+
1. Confronta il primo carattere di entrambe le stringhe.
51+
2. Se il primo carattere della prima stringa è maggiore(o minore) di quello della seconda stringa, allora la prima stringa è maggiore(o minore) della seconda. Abbiamo quindi finito.
52+
3. Altrimenti, se il primo carattere di entrambe le stringhe è identico, viene comparato il secondo nella stessa maniera.
5153
4. Viene ripetuto questo procedimento fino alla fine di una delle due stringhe.
52-
5. Se entrambe le stringhe finiscono nello stesso istante, allora sono uguali. Altrimenti la stringa più lunga è maggiore.
54+
5. Se entrambe le stringhe hanno la medesima lunghezza, allora sono uguali. Altrimenti la stringa più lunga è quella maggiore.
5355

54-
Nell'esempio sopra, il confronto `'Z' > 'A'` ritorna il risultato al primo passo dell'algoritmo.
56+
Nell'esempio sopra, il confronto `'Z' > 'A'` porta ad un risultato al primo passo dell'algoritmo.
5557

56-
Mentre il secondo confronto tra `"Glow"` e `"Glee"` richiede più passi poichè le stringhe vengono confrontate carattere per carattere:
58+
Mentre il secondo confronto tra `"Glow"` e `"Glee"` richiede più passi poiché le stringhe vengono confrontate carattere per carattere:
5759

5860
1. `G` è uguale a `G`.
5961
2. `l` è uguale a `l`.
6062
3. `o` è maggiore di `e`. Qui si ferma. La prima stringa è maggiore.
6163

62-
```smart header="Non un vero dizionario, ma un ordine Unicode"
63-
L'algoritmo di confronto esaminato sopra è molto simile a quello utilizzato nei dizionari cartacei o nelle agende telefoniche. Ma non è proprio uguale.
64+
```smart header="Non un vero e proprio dizionario, ma un ordine Unicode"
65+
L'algoritmo di confronto esaminato sopra è molto simile a quello utilizzato nei dizionari cartacei o nelle agende telefoniche, ma non è esattamente lo stesso.
6466
65-
Ad esempio, le lettere maiuscole contano. Una lettera maiuscola `"A"` non è uguale alla stessa minuscola `"a"`. Qual'è più grande? In realtà, quella minuscola. Come mai? Perchè le lettere minuscole hanno un indice di encoding maggiore nella tabella(Unicode). Ritorneremo nei dettagli specifici e alle conseguenze che porta nel capitolo <info:string>.
67+
Ad esempio, le lettere maiuscole e minuscole contano. La lettera maiuscola `"A"` non è uguale alla lettera minuscola `"a"`. Qual'è la più grande? La maggiore è quella minuscola. Come mai? Perché le lettere minuscole hanno un indice maggiore nella tabella di encoding utilizzata JavaScript (Unicode). Ritorneremo nei dettagli specifici e alle conseguenze nel capitolo <info:string>.
6668
```
6769

6870
## Confronti tra tipi diversi
@@ -76,15 +78,15 @@ alert( '2' > 1 ); // true, la stringa '2' diventa il numero 2
7678
alert( '01' == 1 ); // true, la stringa '01' diventa il numero 1
7779
```
7880

79-
Per i valori booleani, `true` diventa `1` e `false` diventa `0`, quindi:
81+
Per i valori di tipo booleano, `true` diventa `1` e `false` diventa `0`, quindi:
8082

8183
```js run
8284
alert( true == 1 ); // true
8385
alert( false == 0 ); // true
8486
```
8587

8688
````smart header="Una conseguenza divertente"
87-
Questo avviene anche quando:
89+
E' possibile, contemporaneamente, che:
8890
8991
- Due valori sono uguali.
9092
- Uno dei due è `true` come booleano e l'altro è `false` come booleano.
@@ -101,12 +103,12 @@ alert( Boolean(b) ); // true
101103
alert(a == b); // true!
102104
```
103105
104-
Dal punto di vista di JavaScript questo è abbastanza normale. Un controllo di uguaglianza converte sempre utilizzando la conversione numerica (quindi `"0"` diventa `0`), mentre la conversione `Boolean` utilizza altre regole.
106+
Dal punto di vista di JavaScript questo è abbastanza normale. Un controllo di uguaglianza converte sempre utilizzando la conversione numerica (quindi `"0"` diventa `0`), mentre la conversione esplicita a booleano `Boolean` utilizza altre regole.
105107
````
106108

107109
## Uguaglianza stretta
108110

109-
Un controllo di uguaglianza standard `==` ha dei problemi. Non distingue tra `0` e `false`:
111+
Il normale controllo di uguaglianza `==` ha dei problemi. Non distingue tra `0` e `false`:
110112

111113
```js run
112114
alert( 0 == false ); // true
@@ -118,46 +120,47 @@ La stessa cosa accade con una stringa vuota:
118120
alert( '' == false ); // true
119121
```
120122

121-
Questo perchè operandi di diversi tipi vengono convertiti a numeri dall'operatore di uguaglianza `==`. Una stringa vuota, come `false`, diventa zero.
123+
Questo perché operandi di tipo diverso vengono convertiti in numerici dall'operatore di uguaglianza `==`. Una stringa vuota, così come un booleano `false`, diventa zero.
122124

123125
Come possiamo fare se vogliamo distinguere tra `0` e `false`?
124126

125127
**Un operatore di uguaglianza stretta `===` controlla l'uguaglianza senza conversione di tipo.**
126128

127-
In altre parole, se `a` e `b` sono di tipi differenti, allora `a === b` ritornerà subito `false` senza tentare di convertirli.
129+
In altre parole, se `a` e `b` sono di tipo differente, allora `a === b` restituirà subito `false` senza tentare di convertirli.
128130

129131
Proviamolo:
130132

131133
```js run
132-
alert( 0 === false ); // false, perché i tipi sono differenti
134+
alert( 0 === false ); // false, perché il tipo è differente
133135
```
134136

135-
Esiste anche un operatore di "disuguaglianza stretta" `!==`, come analogo per l'operatore `!=`.
137+
Esiste anche un operatore di "disuguaglianza stretta" `!==`, analogo all'operatore `!=`.
136138

137139
L'operatore di uguaglianza stretta è un pò più lungo da scrivere, ma rende ovvio il controllo e lascia meno spazio ad errori.
138140

139141
## Confronto con null e undefined
140142

141-
Diamo un'occhiata ad ulteriori casi limite.
143+
C'è un comportamento poco intuitivo quando `null` o `undefined` vengono comparati con gli altri valori.
142144

143-
C'è un comportamento non atteso quando `null` o `undefined` vengono comparati con gli altri valori.
145+
**Per un controllo di uguaglianza stretta `===`**
144146

145-
Per un controllo di uguaglianza stretta `===`
146-
: Questi valori sono diversi, perchè ognuno di loro appartiene ad un tipo a se stante.
147+
Questi valori sono diversi, perché non appartengono allo stesso tipo.
147148

148149
```js run
149150
alert( null === undefined ); // false
150151
```
151152

152-
Per un controllo non stretto `==`
153-
: Qui c'è una regola speciale. Questi due sono una "dolce coppia": sono uguali l'uno per l'altro, ma non con gli altri valori.
153+
**Per un controllo non stretto `==`**
154+
155+
Qui c'è una regola speciale. Questi due sono una "dolce coppia": tra di loro sono uguali (riferito a `==`), ma non lo sono con con nessun altro valore.
154156

155157
```js run
156158
alert( null == undefined ); // true
157159
```
158160

159-
Per confronti matematici `< > <= >=`
160-
: I valori `null/undefined` vengono convertiti in numeri: `null` diventa `0`, mentre `undefined` diventa `NaN`.
161+
**Per confronti matematici `< > <= >=`**
162+
163+
I valori `null/undefined` vengono convertiti in numeri: `null` diventa `0`, mentre `undefined` diventa `NaN`.
161164

162165
Adesso notiamo una cosa divertente quando proviamo ad applicare queste regole. E, cosa più importante, come non cadere in tranelli a causa di queste caratteristiche.
163166

@@ -171,41 +174,40 @@ alert( null == 0 ); // (2) false
171174
alert( null >= 0 ); // (3) *!*true*/!*
172175
```
173176

174-
Si, matematicamente può sembrare strano. L'ultimo risultato dice che "`null` è maggiore o uguale a zero". Quindi uno dei confronti sopra dovrebbe essere corretto, ma risultano entrambi falsi.
177+
Matematicamente questo è strano. L'ultimo risultato dice che "`null` è maggiore o uguale a zero". Quindi uno dei confronti sopra dovrebbe essere corretto, eppure risultano entrambi falsi.
175178

176-
La ragione è che il controllo di uguaglianza `==` e di confronto `> < >= <=` lavorano diversamente. Il confronto converte `null` ad un numero, quindi lo tratta come `0`. Questo è perchè (3) `null >= 0` è vero e (1) `null > 0` è falso.
179+
La ragione è che il controllo di uguaglianza `==` e di confronto `> < >= <=` lavorano diversamente. Il confronto converte `null` in valore numerico, quindi lo tratta come `0`. Questo è il motivo per cui (3) `null >= 0` è vero e (1) `null > 0` è falso.
177180

178-
D'altra parte, il controllo di uguaglianza `==` per `undefined` e `null` viene definito, senza alcuna conversione, loro sono uguali l'un l'altro ma non sono uguali a nient'altro. Questo è il motivo per cui (2) `null == 0` è falsa.
181+
D'altra parte, il controllo di uguaglianza `==` per `undefined` e `null` viene eseguito, come detto, senza alcuna conversione. Essi sono uguali tra di loro, ma diversi a qualsiasi altro valore. Questo è il motivo per cui (2) `null == 0` è falso.
179182

180183
### Undefined è incomparabile
181184

182-
Il valore `undefined` non passa il confronto con nulla:
185+
Il valore `undefined` non può essere confrontato con nessun altro valore:
183186

184187
```js run
185188
alert( undefined > 0 ); // false (1)
186189
alert( undefined < 0 ); // false (2)
187190
alert( undefined == 0 ); // false (3)
188191
```
189192

190-
Perchè non va bene neanche uno zero? Sempre falso!
191-
192-
Noi abbiamo questi risultati perchè:
193+
Perché non va bene neanche lo zero? E' sempre falso!
193194

194-
- Il confronto `(1)` e `(2)` ritorna `false` perchè `undefined` viene convertito a `NaN`, mentre `NaN` è un valore numerico speciale che ritorna `false` con tutti i confronti.
195-
- Il confronto di uguaglianza `(3)` ritorna `false`, perchè `undefined` è uguale solo a `null`, `undefined` e a nessun altro valore.
195+
Otteniamo questi risultati perché:
196196

197-
### Eludere i problemi
197+
- I confronti `(1)` e `(2)` restituiscono `false` perché `undefined` viene convertito a `NaN`, e `NaN` è un valore numerico speciale che restituisce `false` in tutte le operazioni di confronto.
198+
- Il confronto di uguaglianza `(3)` restituisce `false`, perché `undefined` è uguale solo a `null`, `undefined`, ma a nessun altro valore.
198199

199-
Perchè abbiamo studiato questi esempi? Dovremmo ricordarci queste caratteristiche a memoria? Bhe, in realtà no. Questo tipo di trucchetti diventeranno familiari poco alla volta, ma c'è un modo sicure per eludere i problemi che possono sorgere.
200+
### Evitare i problemi
200201

201-
Semplicemente tratte tutti i confronti con `undefined/null` solo con l'operatore di uguaglianza stretta `===`.
202+
Perché abbiamo studiato questi esempi? Dovremmo ricordarci queste peculiarità tutte le volte? Bhe, in realtà no. Questo tipo di trucchetti diventeranno familiari col tempo, ma c'è un modo sicuro per evitare i problemi che possono sorgere:
202203

203-
Non utilizzate i confronti `>= > < <=` con una variabile che potrebbe valere `null/undefined`, senza essere davvero sicuri di cosa state facendo. Se una variabile può avere questi tipi di valore, è buona norma eseguire un controllo separatamente.
204+
- Trattate tutti i confronti con `undefined/null`, ad eccezione del confronto stretto `===`, con particolare attenzione.
205+
- Non utilizzate i confronti `>= > < <=` con variabili che potrebbero essere `null/undefined`, se non siete più che sicuri di ciò che state facendo. Se una variabile può avere questo tipo di valore, è buona norma eseguire un controllo separatamente.
204206

205207
## Riepilogo
206208

207-
- Gli operatori di confronto ritornano un valore booleano.
208-
- Le stringhe vengono confrontate lettera per lettera seguendo l'ordine "lessico-grafico".
209-
- Quando valori di tipi differenti vengono confrontati, questi vengono converiti a numeri (con eccezione per il controllo di uguaglianza stretto).
210-
- I valori `null` e `undefined` sono `==` solo l'uno per l'altro e a nessun altro valore.
211-
- Va prestata attenzione quando si utilizzano gli operatori di confronto come `>` o `<` con variabili che potrebbero contenere `null/undefined`. Una buona idea è eseguire un controllo separato per `null/undefined`.
209+
- Gli operatori di confronto restituiscono sempre un valore booleano.
210+
- Le stringhe vengono confrontate lettera per lettera seguendo l'ordine "lessicografico".
211+
- Quando valori di tipo differente vengono confrontati, questi vengono convertiti in numeri (ad eccezione del controllo di uguaglianza stretto).
212+
- I valori `null` e `undefined` sono `==` solo tra di loro, e a nessun altro valore.
213+
- Va prestata attenzione quando si utilizzano gli operatori di confronto come `>` o `<` con variabili che potrebbero contenere `null/undefined`. Controllare separatamente l'assegnazione di `null/undefined` è una buona idea.

0 commit comments

Comments
 (0)