Appendice 1: Plus de structures de contrôle (obscures)

Dans le chapitre 2, un certain nombre de structures de contrôle ont été introduites, comme while, for, et break. Pour garder les choses simples, j’en ai laissé d’autres de côté, qui, d’après mon expérience, sont beaucoup moins utiles. Cet appendice décrit rapidement ces structures de contrôles manquantes.


Pour commencer, il y a do. do fonctionne comme while, mais au lieu d’exécuter zéro ou plusieurs fois, il l’exécute une ou plusieurs fois. Une boucle do ressemble à cela :

do {
  var reponse = prompt("Dites 'meuh'.", "");
  print("Vous avez dit '", reponse , "'.");
} while (reponse != "meuh");

Pour bien montrer que la condition est seulement testée après une première exécution, on l’écrit à la fin du corps de la boucle.


Ensuite, il y a continue. Celui-là est très lié à break et peut être utilisé aux mêmes endroits. Alors que le break saute en dehors de la boucle et fait continuer le programme après la boucle, continue saute à l’itération suivante de la boucle.

for (var i = 0; i < 10; i++) {
  if (i % 3 != 0)
    continue;
  print(i, " est divisible par trois.");
}

Un effet similaire peut en général être obtenu simplement avec if, mais il existe des cas où continue sera plus joli.


Quand il y a une boucle à l’intérieur d’une autre boucle, un break ou un continue n’affectera que la boucle interne. Parfois, vous aurez envie de sauter en dehors de la boucle extérieure. Pour être capable de référencer une boucle spécifique, les boucles peuvent être labellisée. Un label est un nom (n’importe quel nom de variable fera l’affaire), suivi de deux points (:).

exterieur: for (var coteA = 1; coteA < 10; coteA++) {
  interieur: for (var coteB = 1; coteB < 10; coteB++) {
    var hypotenuse = Math.sqrt(coteA * coteA + coteB * coteB);
    if (hypotenuse % 1 == 0) {
      print("Un triangle rectangle avec ses côtés adjacents à l’angle droit de longueurs ",
            coteA, " et ", coteB, " a une hypoténuse de ",
            hypotenuse, ".");
      break exterieur;
    }
  }
}

Ensuite, il existe une construction appelée switch qui peut être utilisée pour choisir quel code exécuter suivant une certaine valeur. C’est quelque chose d’utile, mais la syntaxe JavaScript utilisée pour cela (qui est empruntée au langage de programmation C) est si bizarre et moche que je préfère en général utiliser une chaîne de if à la place.

function conseilMeteo(meteo) {
  switch(meteo) {
    case "pluvieux":
      print("Pensez à prendre un parapluie.");
      break;
    case "ensoleillé":
      print("Habillez-vous légèrement.");
    case "nuageux":
      print("Allez dehors.");
      break;
    default:
      print("Type de temps inconnu : ", meteo);
      break;
  }
}

conseilMeteo("ensoleillé");

À l’intérieur du bloc ouvert par switch, vous pouvez écrire un certain nombre de labels case. Le programme sautera au label qui correspond à la valeur donnée au switch, ou sautera à default si on ne trouve aucune valeur correspondante. Il commence alors à exécuter les instructions à cet endroit, et continue à travers les autres labels, jusqu’à ce qu’il atteigne un break. Dans certains cas, comme le cas "ensoleillé" dans notre exemple, cela permet de partager du code entre plusieurs cas (il est recommandé d’aller dehors à la fois pour le temps ensoleillé et pour le temps nuageux). La plupart du temps, cela ajoute juste beaucoup de break pas très jolis, ou bien cause des problèmes quand vous oubliez d’en ajouter un.

Comme pour les boucles, on peut donner un label aux structures switch.


Enfin, il y a le mot-clé nommé with. Je ne l’ai en fait jamais utilisé dans un vrai programme, mais j’ai vu d’autres personnes l’utiliser, il peut donc être utile de savoir ce que c’est. Le code utilisant with ressemble à cela :

var pointDeVue = "extérieur";
var objet = {nom: "Ignatius", pointDeVue: "intérieur"};
with(objet) {
  print("Nom == ", nom, ", point de vue == ", pointDeVue);
  nom = "Raoul";
  var nouvelleVariable = 49;
}
show(objet.nom);
show(nouvelleVariable);

À l’intérieur du bloc, les propriétés de l’objet passé à with agissent comme des variables. Des variables nouvellement introduites ne sont toutefois pas ajoutées à l’objet. Je suppose que l’idée derrière cette construction était que cela pouvait être utile dans des méthodes qui utilisent beaucoup les propriétés de leur objet. Vous pouvez commencer de telles méthodes avec with(this) {…}, et ainsi ne pas avoir à écrire this tout le temps après cela.