Il y a de nombreux opérateurs de comparaison que nous connaissons des mathématiques :
- Plus grand/petit que :
a > b,a < b. - Plus grand/petit ou égal à :
a >= b,a <= b. - Ãgalité :
a == b(veuillez noter le signe de la double égalité==signifie un test dâégalité. Un seul symbolea = bsignifierait une affectation). - Pas égal : en maths la notation est
â, mais en JavaScript elle est écrite comme une assignation avec un signe dâexclamation :a != b.
Dans cet article, nous en apprendrons plus sur les différents types de comparaisons, sur la façon dont JavaScript les fait, y compris sur les particularités importantes.
à la fin, vous trouverez une bonne recette pour éviter les problèmes liés aux âbizarreries JavaScriptâ.
Booléen est le résultat
Tout comme tous les autres opérateurs, une comparaison renvoie une valeur de type booléenne.
trueâ signifie âouiâ, âcorrectâ ou âvraiâ.falseâ signifie ânonâ, âincorrectâ ou âfauxâ.
Par exemple :
alert( 2 > 1 ); // true (correct)
alert( 2 == 1 ); // false (faux)
alert( 2 != 1 ); // true (correct)
Un résultat de comparaison peut être affecté à une variable, comme toute valeur :
let result = 5 > 4; // attribue le résultat de la comparaison
alert( result ); // true
Comparaison de chaînes de caractères
Pour voir quelle chaîne de caractères est plus grande que lâautre, on 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' ); // true
alert( 'Glow' > 'Glee' ); // true
alert( 'Bee' > 'Be' ); // true
alert( '9' > '10' ); // true
Lâalgorithme pour comparer deux chaînes de caractères est simple :
- Compare les premiers caractères des deux chaînes de caractères.
- Si le premier est supérieur (ou inférieur), la première chaîne de caractères est supérieure (ou inférieure) à la seconde. Nous en avons fini.
- Sinon, si les premiers caractères sont égaux, comparez les deuxièmes caractères de la même manière.
- Répéter jusquâà la fin dâune chaîne de caractères.
- Si les deux chaînes de caractères se sont terminées simultanément, alors elles sont égales. Sinon, la chaîne la plus longue est plus grande.
Dans lâexemple ci-dessus, la comparaison 'Z' > 'A' obtient le résultat à 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 :
Gest identique ÃG.lest identique Ãl.oest plus grand quee. On stop ici. La première chaîne de caractères est plus grande.
Lâalgorithme de comparaison ci-dessus est à peu près équivalent à celui utilisé dans les dictionnaires ou les annuaires téléphoniques. Mais ce nâest pas exactement la même chose.
Par exemple, cette notion est importante à comprendre. Une lettre majuscule "A" nâest pas égale à la lettre minuscule "a". Lequel est le plus grand ? En fait, le minuscule "a" lâest. Pourquoi ? Parce que le caractère minuscule a un index plus grand dans la table de codage interne (Unicode). Nous reviendrons sur les détails spécifiques et leurs conséquences dans le chapitre Strings.
Comparaison de différents types
Lorsque les valeurs comparées appartiennent à différents types, elles sont converties en nombres.
Par exemple :
alert( '2' > 1 ); // true, la chaîne '2' devient un numéro 2
alert( '01' == 1 ); // true, chaîne '01' devient un numéro 1
Pour les valeurs booléennes, true devient 1 et false devient 0.
Par exemple :
alert( true == 1 ); // true
alert( false == 0 ); // true
Il est possible que dans le même temps :
- Deux valeurs sont égales.
- Lâun dâeux est
vraicomme booléen et lâautre estfauxcomme booléen.
Par exemple :
let a = 0;
alert( Boolean(a) ); // false
let b = "0";
alert( Boolean(b) ); // true
alert(a == b); // true!
Du point de vue de JavaScript, câest tout à fait normal. Un contrôle dâégalité convertit en utilisant la conversion numérique (par conséquent, "0" devient 0), tandis que la conversion booléenne utilise un autre ensemble de règles.
Ãgalité stricte
Une vérification dâégalité régulière == a un problème. Elle ne peut pas faire la différence entre 0 et false :
alert( 0 == false ); // true
La même chose avec une chaîne de caractères vide :
alert( '' == false ); // true
Câest parce que les opérandes de différents types sont convertis en un nombre par lâopérateur dâégalité ==. Une chaîne de caractères vide, tout comme false, devient un zéro.
Que faire si nous voulons différencier 0 de faux ?
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 tenter de les convertir.
Essayons :
alert( 0 === false ); // false, parce que les types sont différents
Il existe également un opérateur de âstrict non-égalitéâ !==, par analogie à la non-égalité !=.
Lâopérateur de vérification de lâégalité stricte est un peu plus long à écrire, mais rend évident ce qui se passe et laisse moins dâespace pour les erreurs.
Comparaison avec null et undefined
Il existe un comportement non intuitif lorsque null ou undefined sont comparés à dâautres valeurs.
- Pour un contrôle de strict égalité
=== -
Ces valeurs sont différentes car chacune dâentre elles appartient à un type distinct.
alert( null === undefined ); // false - Pour un contrôle dâégalité non strict
== -
Il y a une règle spéciale. Ces deux là forment âun beau coupleâ : ils sont égaux (au sens de
==), mais pas à dâautres valeurs.alert( null == undefined ); // true - Pour les maths et autres comparaisons
<,>,<=,>= -
Les valeurs
null/undefinedsont converties en un nombre :nulldevient0, alors quâundefineddevientNaN.
Voyons maintenant des 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 ces caractéristiques.
Lâétrange résultat : null vs 0
Comparons null avec un zéro :
alert( null > 0 ); // (1) false
alert( null == 0 ); // (2) false
alert( null >= 0 ); // (3) true
Ouais, mathématiquement câest étrange. Le dernier résultat indique que ânull est supérieur ou égal à zéroâ. Alors que lâune des comparaisons au dessus devrait être correcte, mais les deux sont fausses.
La raison est quâune vérification dâégalité (==) et les comparaisons (<, >, <=, >=) fonctionnent différemment. Les comparaisons convertissent null en un nombre, donc le traitent comme 0. Câest pourquoi (3) null >= 0 est vrai et (1) null > 0 est faux.
Dâun autre côté, la vérification de lâégalité == pour undefined et null est définie de telle sorte que, sans aucune conversion, ils sont égaux et ne correspondent à rien dâautre. Câest pourquoi (2) null == 0 est faux.
Un undefined incomparable
La valeur undefined ne doit pas du tout participer aux comparaisons :
alert( undefined > 0 ); // false (1)
alert( undefined < 0 ); // false (2)
alert( undefined == 0 ); // false (3)
Pourquoi est-ce quâil nâaime pas le zéro ? Toujours faux!
Nous avons ces résultats parce que :
- Les comparaisons
(1)et(2)renvoientfalsecarundefinedest converti enNaNetNaNest une valeur numérique spéciale qui renvoiefalsepour toutes les comparaisons. - Le contrôle dâégalité
(3)renvoiefalse, carundefinedest uniquement égal Ãnullet à aucune autre valeur.
Ãviter les problèmes
Pourquoi avons-nous observé ces exemples? Devrions-nous nous souvenir de ces particularités tout le temps ? Eh bien pas vraiment. En fait, ces notions délicates deviennent progressivement familières au fil du temps, mais il existe un moyen solide dâéviter tout problème avec elles.
Il suffit de traiter toute comparaison avec null/undefined (à lâexception de la stricte égalité ===) avec un soin exceptionnel.
Nâutilisez pas de comparaisons =>, >, <, <= avec une variable qui peut être null/undefined, sauf si vous êtes vraiment sûr de ce que vous faites. Si une variable peut avoir de telles valeurs, vérifiez-les séparément.
Résumé
- Les opérateurs de comparaison renvoient une valeur logique.
- Les chaînes de caractères sont comparées lettre par lettre dans lâordre âdictionnaireâ.
- Lorsque des valeurs de différents types sont comparées, elles sont converties en nombres (à lâexclusion dâun contrôle dâégalité strict).
- Les valeurs
nulletundefinedsont égales (==) et ne correspondent à aucune autre valeur. - Soyez prudent lorsque vous utilisez des comparaisons telles que
>ou<avec des variables pouvant parfois êtrenull/undefined. Faire une vérification séparée pournull/undefinedest une bonne idée.
Commentaires
<code>, pour plusieurs lignes â enveloppez-les avec la balise<pre>, pour plus de 10 lignes - utilisez une sandbox (plnkr, jsbin, codepenâ¦)