Parfois, nous devons effectuer diffĂ©rentes actions en fonction dâune condition.
Pour ce faire, nous pouvons utiliser lâinstruction if et lâopĂ©rateur conditionnel ?, Ă©galement appelĂ© opĂ©rateur âpoint dâinterrogationâ.
Lâinstruction âifâ
Lâinstruction if(...) Ă©value une condition entre parenthĂšses et, si le rĂ©sultat est true, exĂ©cute un bloc de code.
Par exemple :
let year = prompt('In which year was ECMAScript-2015 specification published?', '');
if (year == 2015) alert( 'You are right!' );
Dans lâexemple ci-dessus, la condition est une vĂ©rification dâĂ©galitĂ© simple : year == 2015, mais elle peut ĂȘtre beaucoup plus complexe.
Sâil y a plus dâune instruction Ă exĂ©cuter, nous devons envelopper notre bloc de code entre accolades :
if (year == 2015) {
alert( "That's correct!" );
alert( "You're so smart!" );
}
Il est recommandĂ© dâentourer votre bloc de code avec des accolades {} Ă chaque fois avec if, mĂȘme sâil nây a quâune seule instruction. Cela amĂ©liore la lisibilitĂ©.
Conversion booléenne
Lâinstruction if (âŠ) Ă©value lâexpression entre parenthĂšses et la convertit en type boolĂ©en.
Rappelons les rĂšgles de conversion du chapitre Les conversions de types:
- Un nombre
0, une chaĂźne de caractĂšres vide"",null,undefinedetNaNdeviennentfalse. Ă cause de cela, on dit de ces valeurs quâelles sont âfalsyâ. - Les autres valeurs deviennent
true, on dit quâelles sont âtruthyâ.
Donc, le code sous cette condition ne sera jamais exécuté :
if (0) { // 0 est falsy
...
}
⊠Et Ă lâintĂ©rieur de cette condition â il fonctionne toujours :
if (1) { // 1 est truthy
...
}
Nous pouvons également transmettre une valeur booléenne pré-évaluée à if, comme ici :
let cond = (year == 2015); // l'égalité évalue à vrai ou faux
if (cond) {
...
}
La clause âelseâ
Lâinstruction if peut contenir un bloc optionnel else. Il sâexĂ©cute lorsque la condition est fausse.
Par exemple :
let year = prompt('In which year was the ECMAScript-2015 specification published?', '');
if (year == 2015) {
alert( 'You guessed it right!' );
} else {
alert( 'How can you be so wrong?' ); // toute autre valeur que 2015
}
Plusieurs conditions : âelse ifâ
Parfois, nous aimerions tester plusieurs variantes dâune condition. Il y a une clause else if pour cela.
Par exemple :
let year = prompt('En quelle année la spécification ECMAScript-2015 a-t-elle été publiée ?', '');
if (year < 2015) {
alert( 'Too early...' );
} else if (year > 2015) {
alert( 'Too late' );
} else {
alert( 'Exactly!' );
}
Dans le code ci-dessus, JavaScript vĂ©rifie year < 2015. Sâil est falsy, il passe Ă lâannĂ©e de condition suivante year > 2015 et câest toujours false il passe Ă la derniĂšre instruction et affiche la derniĂšre alerte.
Il peut y avoir plus de blocks else if. Le dernier else est optionnel.
OpĂ©rateur ternaire â?â
Parfois, nous devons attribuer une variable en fonction dâune condition.
Par exemple :
let accessAllowed;
let age = prompt('How old are you?', '');
if (age > 18) {
accessAllowed = true;
} else {
accessAllowed = false;
}
alert(accessAllowed);
LâopĂ©rateur dit âternaireâ ou âpoint dâinterrogationâ nous permet de le faire plus rapidement et plus simplement.
LâopĂ©rateur est reprĂ©sentĂ© par un point dâinterrogation ?. AppelĂ© aussi âternaireâ parce que lâopĂ©rateur a trois opĂ©randes. Câest en fait le seul et unique opĂ©rateur en JavaScript qui en a autant.
La syntaxe est :
let result = condition ? value1 : value2
La condition est Ă©valuĂ©e, si elle est vraie, alors value1 est retournĂ©e, sinon â value2.
Par exemple :
let accessAllowed = (age > 18) ? true : false;
Techniquement, nous pouvons omettre les parenthĂšses autour de age > 18. LâopĂ©rateur point dâinterrogation a une faible prĂ©cĂ©dence, il sâexĂ©cute donc aprĂšs la comparaison >.
Cet exemple fera la mĂȘme chose que le prĂ©cĂ©dent :
// l'opérateur de comparaison "age > 18" s'exécute en premier quoiqu'il en soit
// (pas besoin de l'envelopper entre parenthĂšses)
let accessAllowed = age > 18 ? true : false;
Mais les parenthÚses rendent le code plus lisible, il est donc recommandé de les utiliser.
Dans lâexemple ci-dessus, il est possible dâĂ©viter lâopĂ©rateur ternaire, parce que la comparaison elle-mĂȘme renvoie un true/false:
// la mĂȘme chose
let accessAllowed = age > 18;
Multiple â?â
Une sĂ©quence dâopĂ©rateurs point dâinterrogation ? permettent de renvoyer une valeur qui dĂ©pend de plusieurs conditions.
Par exemple :
let age = prompt('age?', 18);
let message = (age < 3) ? 'Hi, baby!' :
(age < 18) ? 'Hello!' :
(age < 100) ? 'Greetings!' :
'What an unusual age!';
alert( message );
Il peut ĂȘtre difficile au dĂ©but de comprendre ce qui se passe. Mais aprĂšs un examen plus approfondi, nous constatons que ce nâest quâune sĂ©quence de tests ordinaire.
-
Le premier point dâinterrogation vĂ©rifie si
age < 3. -
Si vrai â retourne
'Hi, baby!', Sinon, il continue avec lâexpression aprĂšs les deux points â:â suivants et vĂ©rifie siage < 18. -
Si vrai â retourne
'Hello!', Sinon, il continue avec lâexpression aprĂšs les deux points â:â suivants et vĂ©rifie siage < 100. -
Si vrai â retourne
'Greetings!', Sinon, lâexpression continue aprĂšs les derniers deux-points et retourne'What an unusual age!'.
La mĂȘme logique utilisant if..else :
if (age < 3) {
message = 'Hi, baby!';
} else if (age < 18) {
message = 'Hello!';
} else if (age < 100) {
message = 'Greetings!';
} else {
message = 'What an unusual age!';
}
Utilisation non traditionnelle de â?â
Parfois, le point dâinterrogation ? est utilisĂ© en remplacement de if :
let company = prompt('Which company created JavaScript?', '');
(company == 'Netscape') ?
alert('Right!') : alert('Wrong.');
Selon si la condition company == 'Netscape' est vraie ou non, la premiĂšre ou la deuxiĂšme partie aprĂšs ? sâexĂ©cute et affiche lâalerte correspondante.
Nous nâattribuons pas de rĂ©sultat Ă une variable ici. LâidĂ©e est dâexĂ©cuter un code diffĂ©rent en fonction de la condition.
Il nâest pas recommandĂ© dâutiliser lâopĂ©rateur ternaire de cette maniĂšre.
La notation semble ĂȘtre plus courte quâun if, ce qui plaĂźt Ă certains programmeurs. Mais câest moins lisible.
Voici le mĂȘme code avec if pour comparaison :
let company = prompt('Which company created JavaScript?', '');
if (company == 'Netscape') {
alert('Right!');
} else {
alert('Wrong.');
}
Nos yeux scrutent le code verticalement. Les constructions qui couvrent plusieurs lignes sont plus faciles Ă comprendre quâun jeu dâinstructions horizontal long.
LâidĂ©e dâun point dâinterrogation ? est de renvoyer lâune ou lâautre valeur selon la condition. Veuillez lâutiliser pour cela exactement. Il y a if pour exĂ©cuter diffĂ©rentes branches du code.
Commentaires
<code>, pour plusieurs lignes â enveloppez-les avec la balise<pre>, pour plus de 10 lignes - utilisez une sandbox (plnkr, jsbin, codepenâŠ)