JavaScript switch: метки case и fallback default

Оператор JavaScript switch вычисляет выражение один раз и передает выполнение в подходящую метку case по строгому сравнению (===). Используйте его вместо цепочек if...else, когда все ветки проверяют одну переменную на фиксированные значения: диспетчеризация команд, сопоставление статусов или обработка заранее известных опций. Switch собирает такое управление потоком в один блок с явным fall-through, который контролируется break.

Пример JavaScript switch для маршрутизации по значению

Вывод:

Результат появится здесь...

Вывод:

Сохранение файла

Как работает этот пример

  1. switch (command) вычисляет command один раз и сравнивает результат с каждой меткой case в порядке сверху вниз.
  2. Совпадает case "сохранить", поэтому выполнение переходит в эту ветку и выполняет console.log("Сохранение файла").
  3. break завершает блок switch. Без него выполнение проваливается в тело следующего case независимо от совпадения его метки.
  4. default работает как ветка на случай всех остальных значений: она выполняется, если ни одна метка case не подошла. Если default стоит последним, после него не нужен break.

В конструкции JavaScript case вроде case "сохранить": метка - это значение для сопоставления, а не отдельное булево условие.

Частые ошибки в JavaScript switch case

Забыть break: Без него выполнение проваливается в каждое следующее тело case. Убирайте break только при намеренной группировке меток.

const command = "сохранить";

switch (command) {
  // Ошибка — при command === "сохранить" выводятся оба сообщения
  case "сохранить":
    console.log("Сохранение");
  case "закрыть":
    console.log("Закрытие");
}

Смешивать типы в метках case: Switch использует ===, поэтому "2" никогда не совпадет с 2. Перед switch приводите выражение к одному типу.

Повторно объявлять let/const в разных case: Все case используют общую область видимости блока switch. Если в двух case объявить let result, вы получите SyntaxError - оберните каждый case в { }, чтобы создать отдельные лексические области.

Switch vs if…else

Используйте switch, когда…Используйте if...else, когда…
Сравниваете одно выражение с несколькими фиксированными значениямиУсловия включают диапазоны, неравенства или разные переменные
Несколько case разделяют один обработчик через fall-throughУ каждой ветки независимая составная логика

Для больших сопоставлений “значение -> действие” объектный lookup иногда чище, чем любой из этих подходов. Проверяйте отсутствие ключа, чтобы не вызвать undefined как функцию.

Больше примеров

Сгруппируйте несколько меток case, чтобы использовать один обработчик:

const day = "Сб";
switch (day) {
  case "Сб":
  case "Вс":
    console.log("Выходной");
    break;
  default:
    console.log("Будний день");
}

Когда несколько case идут подряд без break между ними, все перечисленные значения переходят в один и тот же блок. Делайте общий обработчик коротким и завершайте его через break, return или throw, чтобы случайно не выполнить следующие case. Если для каждой метки нужна своя логика, избегайте fall-through и задавайте отдельное тело с выходом для каждого case.

FAQ

JavaScript switch использует == или ===?

Switch сравнивает по строгому равенству (===). Приведение типов не происходит, поэтому 0 не совпадает с "0", а null не совпадает с undefined. Следите, чтобы у выражения и меток case был один и тот же тип.

Что произойдет, если убрать break в switch case?

Выполнение провалится в тело следующего case независимо от его метки. Это продолжается до break, return или конца блока switch. Намеренный fall-through используют, чтобы объединить несколько меток case под одним обработчиком.

Может ли default стоять перед другими case?

Да. default можно разместить в любом месте блока switch. Она все равно выполнится только если ни один case не совпал, а дальше выполнение продолжится с этой точки - поэтому после default ставьте break, если это не последняя ветка.