Nous connaissons de nombreux opérateurs de comparaison grâce aux maths.
En JavaScript, ils s’écrivent comme suit :
- Plus grand/moins grand que :
a > b
,a < b
. - Supérieur/moins que ou égal :
a >= b
,a <= b
. - Egale :
a == b
, veuillez noter que le double signe d’égalité==
signifie le test d’égalité, tandis qu’un seula = b
signifie une affectation. - Non égaux. En mathématiques, la notation est
≠
, mais en JavaScript, elle s’écrita != b
.
Dans cet article, nous en apprendrons plus sur les différents types de comparaisons, comment JavaScript les effectue, y compris les particularités importantes.
À la fin, vous trouverez une bonne recette pour éviter les problèmes liés aux « bizarreries JavaScript ».
Le booléen est le résultat
Tous les opérateurs de comparaison renvoient une valeur booléenne :
-
true
– signifie « oui », « correct » ou « la vérité ». -
false
– signifie « non », « faux » ou « pas la vérité ».
Par exemple :
alert( 2 > 1 ); // true (correct)alert( 2 == 1 ); // false (wrong)alert( 2 != 1 ); // true (correct)
Un résultat de comparaison peut être affecté à une variable, comme toute valeur :
let result = 5 > 4; // assign the result of the comparisonalert( result ); // true
Comparaison de chaînes de caractères
Pour savoir si une chaîne de caractères est supérieure à une autre, JavaScript utilise l’ordre dit « dictionnaire » ou « lexicographique ».
En d’autres termes, les chaînes de caractères sont comparées lettre par lettre.
Par exemple :
alert( 'Z' > 'A' ); // truealert( 'Glow' > 'Glee' ); // truealert( 'Bee' > 'Be' ); // true
L’algorithme pour comparer deux chaînes de caractères est simple :
- Comparer le premier caractère des deux chaînes de caractères.
- Si le premier caractère de la première chaîne est supérieur (ou inférieur) à celui de l’autre chaîne, alors la première chaîne est supérieure (ou inférieure) à la seconde. Nous avons terminé.
- Au contraire, si les premiers caractères des deux chaînes sont les mêmes, comparez les seconds caractères de la même façon.
- Répétez jusqu’à la fin de l’une ou l’autre des chaînes.
- Si les deux chaînes se terminent à la même longueur, alors elles sont égales. Sinon, la chaîne la plus longue est plus grande.
Dans le premier exemple ci-dessus, la comparaison 'Z' > 'A'
arrive à un résultat dès la première étape.
La deuxième comparaison 'Glow'
et 'Glee'
nécessite plus d’étapes car les chaînes de caractères sont comparées caractère par caractère:
-
G
est identique àG
. -
l
est identique àl
. -
o
est supérieure àe
. Arrêtez-vous ici. La première chaîne est plus grande.
L’algorithme de comparaison donné ci-dessus est à peu près équivalent à celui utilisé dans les dictionnaires ou les annuaires téléphoniques, mais ce n’est pas exactement le même.
Par exemple, la casse compte. Une lettre majuscule "A"
n’est pas égale à la minuscule "a"
. Laquelle est la plus grande ? La minuscule "a"
. Pourquoi ? Parce que le caractère minuscule a un indice plus grand dans la table d’encodage interne que JavaScript utilise (Unicode). Nous reviendrons sur les détails spécifiques et les conséquences de ceci dans le chapitre Strings.
Comparaison de différents types
Lorsque l’on compare des valeurs de différents types, JavaScript convertit les valeurs en nombres.
Par exemple :
alert( '2' > 1 ); // true, string '2' becomes a number 2alert( '01' == 1 ); // true, string '01' becomes a number 1
Pour les valeurs booléennes, true
devient 1
et false
devient 0
.
Par exemple :
alert( true == 1 ); // truealert( false == 0 ); // true
Il est possible qu’au même moment :
- Deux valeurs soient égales.
- L’une d’elles est
true
en tant que booléen et l’autre estfalse
en tant que booléen.
Par exemple :
let a = 0;alert( Boolean(a) ); // falselet b = "0";alert( Boolean(b) ); // truealert(a == b); // true!
Du point de vue de JavaScript, ce résultat est tout à fait normal. Un contrôle d’égalité convertit les valeurs en utilisant la conversion numérique (donc "0"
devient 0
), alors que la conversion explicite Boolean
utilise un autre ensemble de règles.
Egalité stricte
Un contrôle d’égalité régulier ==
a un problème. Il ne peut pas différencier 0
de false
:
alert( 0 == false ); // true
La même chose se produit avec une chaîne vide :
alert( '' == false ); // true
Cela se produit parce que les opérandes de types différents sont convertis en nombres par l’opérateur d’égalité ==
. Une chaîne vide, tout comme false
, devient un zéro.
Que faire si l’on souhaite différencier 0
de false
?
Un opérateur d’égalité stricte ===
vérifie l’égalité sans conversion de type.
En d’autres termes, si a
et b
sont de types différents, alors a === b
renvoie immédiatement false
sans tentative de conversion.
Essayons-le :
alert( 0 === false ); // false, because the types are different
Il existe également un opérateur de « non-égalité stricte » !==
analogue à !=
.
L’opérateur d’égalité stricte est un peu plus long à écrire, mais rend évident ce qui se passe et laisse moins de place aux erreurs.
Comparaison avec null et undefined
Il y a un comportement non intuitif lorsque null
ou undefined
sont comparés à d’autres valeurs.
Pour une vérification stricte de l’égalité ===
Ces valeurs sont différentes, car chacune d’entre elles est un type différent.
alert( null === undefined ); // false
Pour une vérification non stricte ==
Il y a une règle spéciale. Ces deux-là forment un « doux couple » : ils s’égalent l’un l’autre (au sens de ==
), mais pas n’importe quelle autre valeur.
alert( null == undefined ); // true
Pour les maths et autres comparaisons < > <= >=
null/undefined
sont convertis en nombres : null
devient 0
, tandis que undefined
devient NaN
.
Voyons maintenant les choses amusantes qui se produisent lorsque nous appliquons ces règles. Et, ce qui est plus important, comment ne pas tomber dans un piège avec elles.
Résultat étrange : null vs 0
Comparons null
avec un zéro:
alert( null > 0 ); // (1) falsealert( null == 0 ); // (2) falsealert( null >= 0 ); // (3) true
Mathématiquement, c’est étrange. Le dernier résultat indique que « null
est supérieur ou égal à zéro », donc dans l’une des comparaisons ci-dessus, ce doit être true
, mais elles sont toutes deux fausses.
La raison est qu’un contrôle d’égalité ==
et les comparaisons > < >= <=
fonctionnent différemment. Les comparaisons convertissent null
en un nombre, en le traitant comme 0
. C’est pourquoi (3) null >= 0
est vrai et (1) null > 0
est faux.
En revanche, le contrôle d’égalité ==
pour undefined
et null
est défini de telle sorte que, sans aucune conversion, ils sont égaux entre eux et n’égalent rien d’autre. C’est pourquoi (2) null == 0
est faux.
Un indéfini incomparable
La valeur undefined
ne devrait pas être comparée à d’autres valeurs:
alert( undefined > 0 ); // false (1)alert( undefined < 0 ); // false (2)alert( undefined == 0 ); // false (3)
Pourquoi le zéro lui déplaît-il tant ? Toujours faux !
Nous obtenons ces résultats parce que :
- Les comparaisons
(1)
et(2)
renvoientfalse
carundefined
est converti enNaN
etNaN
est une valeur numérique spéciale qui renvoiefalse
pour toutes les comparaisons. - Le contrôle d’égalité
(3)
renvoiefalse
parce queundefined
n’est égal qu’ànull
,undefined
, et à aucune autre valeur.
Éviter les problèmes
Pourquoi avons-nous revu ces exemples ? Devrions-nous nous souvenir de ces particularités en permanence ? Eh bien, pas vraiment. En fait, ces choses délicates deviendront progressivement familières avec le temps, mais il y a une façon solide d’éviter les problèmes avec elles :
- Traiter toute comparaison avec
undefined/null
, sauf l’égalité stricte===
, avec un soin exceptionnel. - Ne pas utiliser les comparaisons
>= > < <=
avec une variable qui peut êtrenull/undefined
, sauf si vous êtes vraiment sûr de ce que vous faites. Si une variable peut avoir ces valeurs, vérifiez-les séparément.
Summary
- Les opérateurs de comparaison retournent une valeur booléenne.
- Les chaînes de caractères sont comparées lettre par lettre dans l’ordre du « dictionnaire ».
- Lorsque des valeurs de types différents sont comparées, elles sont converties en nombres (à l’exclusion d’une vérification stricte de l’égalité).
- Les valeurs
null
etundefined
sont égales==
entre elles et ne sont égales à aucune autre valeur. - Soyez prudent lorsque vous utilisez des comparaisons comme
>
ou<
avec des variables qui peuvent occasionnellement êtrenull/undefined
. Vérifier lesnull/undefined
séparément est une bonne idée.