Un homme assis à son bureau devant un écran d'ordinateur avec du code affiché

Simplifiez vos conditions en JavaScript avec l'instruction switch

Mis à jour le

L'instruction switch existe depuis les origines de JavaScript, et pourtant elle reste mal comprise : utilisée trop souvent, pas assez, ou, le cas le plus fréquent, utilisée correctement mais avec un break manquant qui crée un bug silencieux. Ce guide couvre la syntaxe, les pièges réels, et les situations où un objet littéral ferait mieux le travail.

📌 Structure de base de l'instruction switch

L'instruction switch évalue une expression une seule fois, puis compare le résultat à chaque case dans l'ordre, en utilisant une égalité stricte (===).

switch (expression) {
  case valeur1:
    // Code à exécuter si expression === valeur1
    break;
  case valeur2:
    // Code à exécuter si expression === valeur2
    break;
  default:
    // Code à exécuter si aucun cas ne correspond
}

L'expression peut être une variable simple, une propriété d'objet ou le retour d'une fonction :

switch (jour) { ... }                 // Variable simple
switch (utilisateur.statut) { ... }   // Propriété d'objet
switch (calculerNote()) { ... }       // Résultat de fonction

⚠️ Le piège numéro un : le fall-through involontaire

Oublier un break, c'est l'erreur la plus courante avec switch. Sans lui, JavaScript ne s'arrête pas au premier case correspondant : il continue d'exécuter tous les blocs suivants jusqu'au prochain break ou la fin du switch. Ce comportement s'appelle le fall-through.

// Bug classique : break oublié au case 'admin'
let role = 'admin';
switch (role) {
    case 'admin':
        console.log('Accès total');
        // ❌ Pas de break : le code "tombe" dans le case suivant
    case 'editeur':
        console.log('Peut publier des articles');
        break;
    case 'lecteur':
        console.log('Lecture seule');
        break;
}
// Résultat inattendu :
// "Accès total"
// "Peut publier des articles"  ← ne devrait pas s'afficher !

Le fall-through peut néanmoins être utilisé intentionnellement pour regrouper des cas qui partagent le même comportement :

// Fall-through intentionnel : même traitement pour plusieurs valeurs
switch (jour) {
    case 'samedi':
    case 'dimanche':
        console.log('Week-end : bureau fermé');
        break;
    default:
        console.log('Jour ouvré');
}

🎯 La comparaison stricte : attention aux types

switch utilise ===, pas ==. Cela signifie que la valeur et le type doivent correspondre. C'est un piège fréquent lorsque les données viennent d'un formulaire HTML (tout est string) ou d'une API (les types peuvent surprendre).

let note = "3"; // Vient d'un input HTML : c'est une string

switch (note) {
    case 3:
        console.log('Mention passable'); // ❌ Ne s'exécute jamais : 3 !== "3"
        break;
    case "3":
        console.log('Mention passable'); // ✅ Correspond
        break;
}

🎮 Exemple concret : gestion d'actions dans un jeu

Un switch est particulièrement lisible pour mapper des commandes à des comportements distincts :

Diagramme illustrant l'utilisation de l'instruction switch dans un jeu de rôle
Diagramme illustrant l'utilisation de l'instruction switch dans un jeu de rôle.
function combattreMonstre(typeMonstre) {
    switch (typeMonstre) {
        case 'dragon':
            console.log("Vous utilisez votre bouclier anti-feu !");
            break;
        case 'troll':
            console.log("Vous dégainez votre épée en argent !");
            break;
        case 'vampire':
            console.log("Vous sortez votre pieu en bois !");
            break;
        case 'loup-garou':
            console.log("Vous chargez votre pistolet avec des balles en argent !");
            break;
        default:
            console.log("Monstre inconnu. Vous préférez fuir, et c'est souvent la bonne décision.");
    }
}

combattreMonstre('dragon');  // "Vous utilisez votre bouclier anti-feu !"
combattreMonstre('licorne'); // "Monstre inconnu. Vous préférez fuir…"

💡 switch vs objet littéral : quand préférer l'alternative ?

Pour des mappings simples valeur → résultat, un objet littéral est souvent plus court, plus lisible, et plus facile à tester unitairement. C'est une alternative que beaucoup de développeurs ne connaissent pas ou oublie.

// Avec switch
function getLibelleJour(jour) {
    switch (jour) {
        case 1: return 'Lundi';
        case 2: return 'Mardi';
        case 3: return 'Mercredi';
        default: return 'Jour inconnu';
    }
}

// Avec un objet littéral : plus court, facilement extensible
const JOURS = {
    1: 'Lundi',
    2: 'Mardi',
    3: 'Mercredi',
};
const getLibelleJour = (jour) => JOURS[jour] ?? 'Jour inconnu';

En revanche, switch reste préférable quand chaque cas exécute de la logique (plusieurs lignes de code, appels de fonctions, effets de bord) plutôt que de simplement retourner une valeur.

📊 Quand utiliser switch, et quand ne pas le faire

✅ Bons candidats pour switch

  • Gérer des états ou statuts avec une logique propre à chaque cas (ex : machine à états, gestion d'événements UI)
  • Remplacer plus de 3–4 else if qui comparent la même variable à des valeurs constantes
  • Regrouper des cas avec le fall-through intentionnel pour éviter la répétition

❌ À éviter avec switch

  • Comparer des plages de valeurs (if (score > 80)) : switch ne supporte pas les expressions booléennes dans les case
  • De simples mappings valeur → valeur : préférez un objet littéral (voir ci-dessus)
  • Tester plusieurs variables différentes : switch n'évalue qu'une seule expression

📝 Quelques règles à retenir

Toujours penser au break

Chaque case doit se terminer par un break sauf si le fall-through est voulu et commenté dans le code. Un fall-through non documenté est un bug qui attend son heure.

Le default n'est pas optionnel en production

Techniquement facultatif, il est dans la pratique indispensable dès que le code tourne avec des données externes (API, formulaires, saisie utilisateur). Sans default, un cas non prévu passe en silence, sans erreur, sans log, sans rien.

La comparaison est stricte, toujours

Convertissez explicitement vos valeurs si nécessaire (Number(valeur), String(valeur)) plutôt que de compter sur une correspondance implicite. C'est une source de bugs particulièrement difficile à tracer.

Sources

Infographie d'un ordinateur avec du code JavaScript : Le langage qui rend le web vivant

C'est quoi JavaScript ? À quoi ça sert ? Découvrez comment ce langage fonctionne et pourquoi il est indispensable dans le développement web moderne.

Un homme assis devant un ordinateur avec du code à l'écran Supprimer les doublons dans un tableau avec JavaScript

Découvrez comment supprimer facilement les doublons dans un tableau en JavaScript grâce à l'objet Set.

Une personne en train de taper sur le clavier d'un ordinateur portable Organiser ses titres HTML pour optimiser le SEO et l'accessibilité

Découvrez comment bien structurer vos titres HTML pour améliorer votre référencement naturel et faciliter la navigation sur votre site web.