JavaScript switch: метки case и fallback default
Оператор JavaScript switch вычисляет выражение один раз и передает выполнение в подходящую метку case по строгому сравнению (===). Используйте его вместо цепочек if...else, когда все ветки проверяют одну переменную на фиксированные значения: диспетчеризация команд, сопоставление статусов или обработка заранее известных опций. Switch собирает такое управление потоком в один блок с явным fall-through, который контролируется break.
Пример JavaScript switch для маршрутизации по значению
Вывод:
Результат появится здесь...
Вывод:
Сохранение файла
Как работает этот пример
switch (command)вычисляетcommandодин раз и сравнивает результат с каждой меткой case в порядке сверху вниз.- Совпадает case
"сохранить", поэтому выполнение переходит в эту ветку и выполняетconsole.log("Сохранение файла"). breakзавершает блок switch. Без него выполнение проваливается в тело следующего case независимо от совпадения его метки.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, если это не последняя ветка.