18 octobre 2023

Branche conditionnelle : if, '?'

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, undefined et NaN deviennent false. À 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.

Veuillez noter :

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.

  1. Le premier point d’interrogation vĂ©rifie si age < 3.

  2. Si vrai – retourne 'Hi, baby!', Sinon, il continue avec l’expression aprĂšs les deux points “:” suivants et vĂ©rifie si age < 18.

  3. Si vrai – retourne 'Hello!', Sinon, il continue avec l’expression aprĂšs les deux points “:” suivants et vĂ©rifie si age < 100.

  4. 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.

Exercices

importance: 5

Est-ce que alert sera affiché ?

if ("0") {
  alert( 'Hello' );
}

Oui, il sera affiché.

Toute chaüne de caractùres à l’exception d’une chaüne vide (et "0" n’est pas vide) devient vraie dans le contexte logique.

Nous pouvons exécuter et vérifier:

if ("0") {
  alert( 'Hello' );
}
importance: 2

En utilisant la construction if..else, Ă©crivez le code qui demande : ‘Quel est le nom “officiel” de JavaScript?’

Si le visiteur entre “ECMAScript”, alors Ă©ditez une sortie “Bonne rĂ©ponse !”, Sinon – retourne “Ne sait pas ? ECMAScript!”

DĂ©mo dans une nouvelle fenĂȘtre

<!DOCTYPE html>
<html>

<body>
  <script>
    'use strict';

    let value = prompt('What is the "official" name of JavaScript?', '');

    if (value == 'ECMAScript') {
      alert('Right!');
    } else {
      alert("You don't know? ECMAScript!");
    }
  </script>


</body>

</html>
importance: 2

En utilisant if..else, Ă©crivez le code qui obtient un numĂ©ro via le prompt, puis l’affiche en alert :

  • 1, si la valeur est supĂ©rieure Ă  zĂ©ro,
  • -1, si infĂ©rieur Ă  zĂ©ro,
  • 0, si est Ă©gal Ă  zĂ©ro.

Dans cet exercice, nous supposons que l’entrĂ©e est toujours un nombre.

DĂ©mo dans une nouvelle fenĂȘtre

let value = prompt('Type a number', 0);

if (value > 0) {
  alert( 1 );
} else if (value < 0) {
  alert( -1 );
} else {
  alert( 0 );
}
importance: 5

Réécrivez ce if en utilisant l’opĂ©rateur conditionnel '?' :

let result;

if (a + b < 4) {
  result = 'Below';
} else {
  result = 'Over';
}
let result = (a + b < 4) ? 'Below' : 'Over';
importance: 5

Réécrire ce if..else en utilisant plusieurs opérateurs ternaires '?'.

Pour plus de lisibilité, il est recommandé de diviser le code en plusieurs lignes.

let message;

if (login == 'Employee') {
  message = 'Hello';
} else if (login == 'Director') {
  message = 'Greetings';
} else if (login == '') {
  message = 'No login';
} else {
  message = '';
}
let message = (login == 'Employee') ? 'Hello' :
  (login == 'Director') ? 'Greetings' :
  (login == '') ? 'No login' :
  '';
Carte du tutoriel

Commentaires

lire ceci avant de commenter

  • Si vous avez des amĂ©liorations Ă  suggĂ©rer, merci de soumettre une issue GitHub ou une pull request au lieu de commenter.
  • Si vous ne comprenez pas quelque chose dans l'article, merci de prĂ©ciser.
  • Pour insĂ©rer quelques bouts de code, utilisez la balise <code>, pour plusieurs lignes – enveloppez-les avec la balise <pre>, pour plus de 10 lignes - utilisez une sandbox (plnkr, jsbin, codepen
)