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
- 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>≠</code>, in JavaScript viene scritto come un'assegnazione ma con un punto esclamativo davanti: <code>a != b</code>.
- Maggiore/minore o uguale: <code>a >= b</code>, <code>a <= 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>≠</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à
9
11
10
12
## Il risultato è booleano
11
13
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 operatoridi confronto restituiscono un valore booleano.
13
15
14
16
-`true` -- significa "si", "corretto" o "vero".
15
17
-`false` -- significa "no", "sbagliato" o "falso".
@@ -31,9 +33,9 @@ alert( result ); // true
31
33
32
34
## Confronto di stringhe
33
35
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".
35
37
36
-
In altre parole, le stringhe vengono confrontate lettera a lettera.
38
+
In altre parole, le stringhe vengono confrontate lettera per lettera.
L'algoritmo per confrontare due stringhe è semplice:
47
49
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.
51
53
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.
53
55
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.
55
57
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:
57
59
58
60
1.`G` è uguale a `G`.
59
61
2.`l` è uguale a `l`.
60
62
3.`o` è maggiore di `e`. Qui si ferma. La prima stringa è maggiore.
61
63
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.
64
66
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>.
66
68
```
67
69
68
70
## Confronti tra tipi diversi
@@ -76,15 +78,15 @@ alert( '2' > 1 ); // true, la stringa '2' diventa il numero 2
76
78
alert( '01'==1 ); // true, la stringa '01' diventa il numero 1
77
79
```
78
80
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:
80
82
81
83
```js run
82
84
alert( true==1 ); // true
83
85
alert( false==0 ); // true
84
86
```
85
87
86
88
````smart header="Una conseguenza divertente"
87
-
Questo avviene anche quando:
89
+
E' possibile, contemporaneamente, che:
88
90
89
91
- Due valori sono uguali.
90
92
- Uno dei due è `true` come booleano e l'altro è `false` come booleano.
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.
105
107
````
106
108
107
109
## Uguaglianza stretta
108
110
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`:
110
112
111
113
```js run
112
114
alert( 0==false ); // true
@@ -118,46 +120,47 @@ La stessa cosa accade con una stringa vuota:
118
120
alert( ''==false ); // true
119
121
```
120
122
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.
122
124
123
125
Come possiamo fare se vogliamo distinguere tra `0` e `false`?
124
126
125
127
**Un operatore di uguaglianza stretta `===` controlla l'uguaglianza senza conversione di tipo.**
126
128
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.
128
130
129
131
Proviamolo:
130
132
131
133
```js run
132
-
alert( 0===false ); // false, perché i tipi sono differenti
134
+
alert( 0===false ); // false, perché il tipo è differente
133
135
```
134
136
135
-
Esiste anche un operatore di "disuguaglianza stretta" `!==`, come analogo per l'operatore `!=`.
137
+
Esiste anche un operatore di "disuguaglianza stretta" `!==`, analogo all'operatore `!=`.
136
138
137
139
L'operatore di uguaglianza stretta è un pò più lungo da scrivere, ma rende ovvio il controllo e lascia meno spazio ad errori.
138
140
139
141
## Confronto con null e undefined
140
142
141
-
Diamo un'occhiata ad ulteriori casi limite.
143
+
C'è un comportamento poco intuitivo quando `null` o `undefined` vengono comparati con gli altri valori.
142
144
143
-
C'è un comportamento non atteso quando `null` o `undefined` vengono comparati con gli altri valori.
145
+
**Per un controllo di uguaglianza stretta `===`**
144
146
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.
147
148
148
149
```js run
149
150
alert( null === undefined ); // false
150
151
```
151
152
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.
154
156
155
157
```js run
156
158
alert( null == undefined ); // true
157
159
```
158
160
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`.
161
164
162
165
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.
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.
175
178
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.
177
180
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.
179
182
180
183
### Undefined è incomparabile
181
184
182
-
Il valore `undefined` non passa il confronto con nulla:
185
+
Il valore `undefined` non può essere confrontato con nessun altro valore:
183
186
184
187
```js run
185
188
alert( undefined>0 ); // false (1)
186
189
alert( undefined<0 ); // false (2)
187
190
alert( undefined==0 ); // false (3)
188
191
```
189
192
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!
193
194
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é:
196
196
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.
198
199
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
200
201
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:
202
203
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.
204
206
205
207
## Riepilogo
206
208
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