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â¦)