JavaScript Anfänger

Switch Statements in JavaScript

Switch Statements in JavaScript

Wenn du mehrere Werte prüfen musst, wird if/else schnell unübersichtlich. Switch Statements bieten eine elegante Alternative für Mehrfachverzweigungen.

Das Problem mit vielen if/else

const tag = "Montag";

// Unübersichtlich mit if/else
if (tag === "Montag") {
    console.log("Wochenstart!");
} else if (tag === "Dienstag") {
    console.log("Zweiter Tag");
} else if (tag === "Mittwoch") {
    console.log("Bergfest!");
} else if (tag === "Donnerstag") {
    console.log("Fast Freitag");
} else if (tag === "Freitag") {
    console.log("Wochenende naht!");
} else if (tag === "Samstag") {
    console.log("Wochenende!");
} else if (tag === "Sonntag") {
    console.log("Noch Wochenende!");
} else {
    console.log("Ungültiger Tag");
}

Die Lösung: Switch

const tag = "Montag";

switch (tag) {
    case "Montag":
        console.log("Wochenstart!");
        break;
    case "Dienstag":
        console.log("Zweiter Tag");
        break;
    case "Mittwoch":
        console.log("Bergfest!");
        break;
    case "Donnerstag":
        console.log("Fast Freitag");
        break;
    case "Freitag":
        console.log("Wochenende naht!");
        break;
    case "Samstag":
        console.log("Wochenende!");
        break;
    case "Sonntag":
        console.log("Noch Wochenende!");
        break;
    default:
        console.log("Ungültiger Tag");
}

Anatomie eines Switch Statements

switch (ausdruck) {
    case wert1:
        // Code für wert1
        break;
    case wert2:
        // Code für wert2
        break;
    default:
        // Code wenn nichts passt
}

Die Bestandteile

TeilBeschreibung
switch (ausdruck)Der Wert, der geprüft wird
case wert:Ein möglicher Wert zum Vergleichen
break;Beendet den Switch-Block
default:Wird ausgeführt, wenn kein case passt

Wichtig: Das break Statement

Ohne break läuft der Code weiter! Das nennt man “Fall-Through”:

const note = 2;

// OHNE break - Fall-Through!
switch (note) {
    case 1:
        console.log("Sehr gut");
    case 2:
        console.log("Gut");
    case 3:
        console.log("Befriedigend");
    default:
        console.log("Ende");
}

// Ausgabe bei note = 2:
// "Gut"
// "Befriedigend"
// "Ende"

Mit break - Korrekt:

const note = 2;

switch (note) {
    case 1:
        console.log("Sehr gut");
        break;
    case 2:
        console.log("Gut");
        break;
    case 3:
        console.log("Befriedigend");
        break;
    default:
        console.log("Ende");
}

// Ausgabe: "Gut"

Fall-Through bewusst nutzen

Manchmal ist Fall-Through gewünscht - wenn mehrere Werte das gleiche Ergebnis haben sollen:

const tag = "Samstag";

switch (tag) {
    case "Montag":
    case "Dienstag":
    case "Mittwoch":
    case "Donnerstag":
    case "Freitag":
        console.log("Arbeitstag");
        break;
    case "Samstag":
    case "Sonntag":
        console.log("Wochenende!");
        break;
    default:
        console.log("Ungültiger Tag");
}
// Ausgabe: "Wochenende!"

Praktische Beispiele

Beispiel 1: Monatslänge berechnen

function getTageImMonat(monat, jahr) {
    switch (monat) {
        case 1: case 3: case 5: case 7:
        case 8: case 10: case 12:
            return 31;

        case 4: case 6: case 9: case 11:
            return 30;

        case 2:
            // Schaltjahr prüfen
            const istSchaltjahr = (jahr % 4 === 0 && jahr % 100 !== 0) || (jahr % 400 === 0);
            return istSchaltjahr ? 29 : 28;

        default:
            return -1; // Ungültiger Monat
    }
}

console.log(getTageImMonat(2, 2024)); // 29 (Schaltjahr)
console.log(getTageImMonat(2, 2023)); // 28
console.log(getTageImMonat(7, 2024)); // 31

Beispiel 2: Benutzer-Rollen

function getBerechtigungen(rolle) {
    let berechtigungen = [];

    switch (rolle) {
        case "admin":
            berechtigungen.push("benutzer_loeschen");
            berechtigungen.push("einstellungen_aendern");
            // Fall-through gewollt!
        case "moderator":
            berechtigungen.push("beitraege_loeschen");
            berechtigungen.push("benutzer_sperren");
            // Fall-through gewollt!
        case "user":
            berechtigungen.push("beitraege_schreiben");
            berechtigungen.push("profil_bearbeiten");
            break;
        default:
            berechtigungen.push("nur_lesen");
    }

    return berechtigungen;
}

console.log(getBerechtigungen("admin"));
// ["benutzer_loeschen", "einstellungen_aendern", "beitraege_loeschen",
//  "benutzer_sperren", "beitraege_schreiben", "profil_bearbeiten"]

console.log(getBerechtigungen("user"));
// ["beitraege_schreiben", "profil_bearbeiten"]

Beispiel 3: Taschenrechner

function rechne(a, operator, b) {
    switch (operator) {
        case "+":
            return a + b;
        case "-":
            return a - b;
        case "*":
            return a * b;
        case "/":
            if (b === 0) {
                return "Fehler: Division durch 0";
            }
            return a / b;
        case "%":
            return a % b;
        case "**":
            return a ** b;
        default:
            return "Unbekannter Operator";
    }
}

console.log(rechne(10, "+", 5));  // 15
console.log(rechne(10, "-", 5));  // 5
console.log(rechne(10, "*", 5));  // 50
console.log(rechne(10, "/", 5));  // 2
console.log(rechne(2, "**", 8));  // 256

Beispiel 4: HTTP Status Codes

function getStatusMessage(code) {
    switch (code) {
        case 200:
            return "OK - Anfrage erfolgreich";
        case 201:
            return "Created - Ressource erstellt";
        case 204:
            return "No Content - Erfolgreich, keine Daten";
        case 400:
            return "Bad Request - Ungültige Anfrage";
        case 401:
            return "Unauthorized - Nicht authentifiziert";
        case 403:
            return "Forbidden - Keine Berechtigung";
        case 404:
            return "Not Found - Nicht gefunden";
        case 500:
            return "Internal Server Error - Serverfehler";
        case 502:
            return "Bad Gateway - Gateway-Fehler";
        case 503:
            return "Service Unavailable - Dienst nicht verfügbar";
        default:
            if (code >= 200 && code < 300) {
                return "Erfolg (2xx)";
            } else if (code >= 400 && code < 500) {
                return "Client-Fehler (4xx)";
            } else if (code >= 500) {
                return "Server-Fehler (5xx)";
            }
            return "Unbekannter Status";
    }
}

console.log(getStatusMessage(200)); // "OK - Anfrage erfolgreich"
console.log(getStatusMessage(404)); // "Not Found - Nicht gefunden"

Switch mit Blöcken

Wenn du Variablen in einem case deklarierst, brauchst du geschweifte Klammern:

const aktion = "erstellen";

switch (aktion) {
    case "erstellen": {
        const nachricht = "Neuer Eintrag wird erstellt...";
        const timestamp = Date.now();
        console.log(nachricht, timestamp);
        break;
    }
    case "loeschen": {
        const nachricht = "Eintrag wird gelöscht..."; // Gleichername - OK wegen Block
        console.log(nachricht);
        break;
    }
    default: {
        console.log("Unbekannte Aktion");
    }
}

Switch vs. if/else - Wann was?

Verwende switch wenn:

// Viele exakte Wertvergleiche
switch (farbe) {
    case "rot": /* ... */ break;
    case "grün": /* ... */ break;
    case "blau": /* ... */ break;
}

// Enums oder feste Werte
switch (status) {
    case "PENDING": /* ... */ break;
    case "APPROVED": /* ... */ break;
    case "REJECTED": /* ... */ break;
}

Verwende if/else wenn:

// Bereiche prüfen
if (alter < 18) {
    console.log("Minderjährig");
} else if (alter < 65) {
    console.log("Erwachsen");
} else {
    console.log("Senior");
}

// Komplexe Bedingungen
if (user.isAdmin && user.isActive) {
    // ...
}

// Unterschiedliche Vergleiche
if (a > b && c !== d) {
    // ...
}

Alternative: Object Lookup

Für einfache Wertzuordnungen ist ein Object oft eleganter:

// Statt switch:
function getNoteName(note) {
    switch (note) {
        case 1: return "Sehr gut";
        case 2: return "Gut";
        case 3: return "Befriedigend";
        case 4: return "Ausreichend";
        case 5: return "Mangelhaft";
        case 6: return "Ungenügend";
        default: return "Ungültig";
    }
}

// Besser - Object Lookup:
const notenNamen = {
    1: "Sehr gut",
    2: "Gut",
    3: "Befriedigend",
    4: "Ausreichend",
    5: "Mangelhaft",
    6: "Ungenügend"
};

function getNoteName(note) {
    return notenNamen[note] || "Ungültig";
}

console.log(getNoteName(2)); // "Gut"

Mit Funktionen:

const aktionen = {
    erstellen: () => console.log("Erstelle..."),
    loeschen: () => console.log("Lösche..."),
    bearbeiten: () => console.log("Bearbeite..."),
    default: () => console.log("Unbekannt")
};

function ausfuehren(aktion) {
    const fn = aktionen[aktion] || aktionen.default;
    fn();
}

ausfuehren("erstellen"); // "Erstelle..."
ausfuehren("xyz");       // "Unbekannt"

Häufige Fehler

1. Break vergessen

// ❌ Falsch - Break vergessen
switch (x) {
    case 1:
        doSomething();
        // break fehlt!
    case 2:
        doSomethingElse();
        break;
}

// ✅ Richtig
switch (x) {
    case 1:
        doSomething();
        break;
    case 2:
        doSomethingElse();
        break;
}

2. Strikte Gleichheit vergessen

Switch verwendet === (strikte Gleichheit):

const wert = "1";

switch (wert) {
    case 1:
        console.log("Zahl 1");
        break;
    case "1":
        console.log("String 1");
        break;
}
// Ausgabe: "String 1" (weil "1" !== 1)

3. Default vergessen

// ❌ Ohne default - unbehandelte Fälle
switch (status) {
    case "ok":
        return true;
    case "error":
        return false;
}
// Was passiert bei "pending"? undefined!

// ✅ Mit default
switch (status) {
    case "ok":
        return true;
    case "error":
        return false;
    default:
        return null;
}

Zusammenfassung

KonzeptBeschreibung
switch (wert)Prüft einen Wert gegen mehrere Cases
case x:Definiert einen möglichen Wert
break;Beendet den Switch-Block
default:Wird ausgeführt wenn kein Case passt
Fall-ThroughOhne break läuft Code weiter
===Switch verwendet strikte Gleichheit

Übung: Baue eine Funktion getJahreszeit(monat), die für Monate 1-12 die passende Jahreszeit zurückgibt. Nutze Fall-Through für Monate der gleichen Jahreszeit!