else n'existe jamais seul. Il complète un if en prenant en charge tout ce que la condition a laissé de côté, ce qui garantit qu'exactement une des deux branches sera parcourue.
C'est aussi le mot-clé qu'on écrit trop souvent. Une partie des else d'une base de code peuvent disparaître sans rien changer au comportement, et le code y gagne toujours.
Définition
else se place immédiatement après le bloc d'un if et exécute son propre bloc quand la condition a été évaluée à faux. Il ne porte pas de condition : il ramasse tous les autres cas.
const stock = 0;
if (stock > 0) {
console.log("Disponible");
} else {
console.log("Rupture de stock"); // c'est cette branche
}Les deux blocs s'excluent : le moteur n'en exécute jamais qu'un seul, puis reprend après l'accolade fermante du second.
La chaîne else if
else if n'est pas un mot-clé, c'est un if écrit dans le else du précédent. La chaîne se lit de haut en bas et s'arrête à la première condition vraie, ce qui rend l'ordre des tests décisif.
function tarif(age) {
if (age < 12) {
return "enfant";
} else if (age < 26) {
return "jeune";
} else {
return "plein tarif";
}
}
console.log(tarif(8), tarif(20), tarif(40)); // enfant jeune plein tarifInverser les deux premières conditions casserait la fonction sans lever la moindre erreur : un enfant de huit ans passerait le test age < 26 et repartirait avec le tarif jeune. Quand les cas sont nombreux et comparés à une même valeur, un switch exprime la même intention de façon plus plate.
Quand s'en passer
Dès qu'une branche se termine par un return, le else devient inutile : la fonction est déjà partie. Le retirer supprime un niveau d'indentation par cas traité.
function tarif(age) {
if (age < 12) return "enfant";
if (age < 26) return "jeune";
return "plein tarif";
}La version courte se lit comme une liste de règles, du cas le plus étroit au cas général. La version longue oblige à suivre trois niveaux d'imbrication pour atteindre la même information.
Sans accolades, else ne gouverne que l'instruction qui le suit immédiatement. Une deuxième ligne alignée dessous n'appartient plus à la branche et s'exécute dans tous les cas, sans qu'aucun message ne le signale. C'est la raison pour laquelle les accolades sont exigées même sur une seule ligne.
Questions fréquentes
Faut-il toujours écrire un else ?
Non. Un else vide, ou qui répète ce que le code fait déjà par défaut, ajoute du bruit sans information. La question utile est différente : le cas contraire mérite-t-il un traitement propre ? Si oui, la branche a sa place ; sinon, l'absence de branche dit exactement la même chose.
Quelle différence avec l'opérateur ternaire ?
L'Opérateur ternaire (?:) choisit entre deux valeurs, if et else choisissent entre deux blocs d'instructions. Pour affecter une variable selon une condition, le ternaire tient sur une ligne et se lit mieux. Dès qu'une branche fait plusieurs choses, la forme en blocs reprend l'avantage.
Comment gérer une valeur manquante plutôt qu'une condition fausse ?
Un if suivi d'un else traite zéro et la chaîne vide comme des absences, ce qui est rarement voulu. Pour ne remplacer que null et undefined, la Coalescence des nuls (??) est faite pour cela et laisse passer les valeurs légitimes qui se trouvent être fausses.