switch
В холле большого здания висит указатель: «Бухгалтерия — 3-й этаж, отдел кадров — 5-й этаж, столовая — 1-й этаж». Вы не обходите все этажи по очереди, а находите в указателе свою строку и сразу едете на нужный этаж.
Цепочка else if похожа на обход этажей. Когда одну переменную сравнивают с несколькими значениями, цепочка повторяет одно и то же сравнение в каждой ветке. Инструкция switch работает как указатель в холле: вычисляет выражение в скобках один раз и переходит к case с таким же значением:
const command = "stop";
switch (command) {
case "start":
console.log("Starting");
break;
case "stop":
console.log("Stopping"); // Stopping
break;
default:
console.log("Unknown command");
}Давайте пройдём по программе:
switch (command)вычисляетcommandи получает"stop".case "start":— значение не совпадает, эта ветка пропускается.case "stop":— совпадение, поэтому выполняется код под ним, и программа выводитStopping.breakзавершаетswitch, и доdefaultдело не доходит.
Ветки case и default
В switch два вида веток, и у каждой своя роль.
Ветка case
После слова case стоит значение и двоеточие, а ниже — код ветки. Выполнение начинается со строки после подходящего case.
Веток case может быть сколько угодно, и проверяются они по очереди, сверху вниз. Первое совпадение решает, откуда начнётся выполнение.
Ветка default
Ветка default выполняется, когда не подошёл ни один case. Обычно её ставят последней, как else в цепочке if.
Если ни один case не подошёл, а ветки default нет, не выполняется ничего. Программа идёт дальше, после закрывающей скобки switch.
Где кончается ветка
Ветка case не заканчивается сама. Выполнение идёт вниз, пока его не остановят.
Через break
Инструкция break завершает весь switch, и программа продолжает работу после его закрывающей скобки. Поэтому break ставят в конце каждой ветки.
Через return
Внутри функции ветку часто завершают return. Он выходит из всей функции, и break после него не нужен.
Проваливание
Без break выполнение не останавливается на следующем case, а проваливается в его код, не проверяя значение. Этим пользуются, когда у нескольких значений общий код: пустой case 6: проваливается в case 7:.
const day = 6;
switch (day) {
case 6:
case 7:
console.log("weekend"); // weekend
break;
default:
console.log("workday");
}Разберём, что происходит:
dayравен6, поэтому выполнение начинается подcase 6:.- Под ним кода нет, и выполнение проваливается в
case 7:, не сравнивая6с7. console.log("weekend")выводитweekend, аbreakзавершаетswitch.
При day, равном 6 или 7, программа выводит weekend, при любом другом значении — workday.
Здесь аналогия с указателем перестаёт работать. В указателе каждая строка отдельна, а в switch ветки идут подряд, и без break выполнение перетекает в следующую.
Сравнение через ===
switch сравнивает значение с каждым case строгим равенством ===, без приведения типов. На собеседовании об этом спрашивают часто: строка "2" не равна числу 2, поэтому здесь выполняется default:
const input = "2";
switch (input) {
case 2:
console.log("two");
break;
default:
console.log("not found"); // not found
}Если значение пришло строкой, а в case стоят числа, строку сначала переводят в число. С заголовком switch (Number(input)) программа выводит two.
Равенство — единственная проверка, которую делает case. Диапазоны вроде score >= 90 проверяют цепочкой if и else if.
Частая ошибка
В ветке забыли break:
const level = 1;
switch (level) {
case 1:
console.log("beginner"); // ✗
case 2:
console.log("advanced");
break;
}При level, равном 1, программа выводит две строки: beginner и advanced. Ошибки нет: проваливание разрешено, и JavaScript не предупреждает о пропущенном break.
После console.log("beginner") выполнение проваливается в case 2 и останавливается только на break. Ставьте break в конец каждой ветки, которая не должна проваливаться.
Главное
switchвычисляет выражение один раз и начинает выполнение с подходящегоcase, а если такого нет — сdefault.- Ветка заканчивается на
breakилиreturn; без них выполнение проваливается в следующийcase. caseсравнивает строго, через===: строка"2"не совпадёт с числом2.- Диапазоны значений проверяют цепочкой
ifиelse if, а неswitch.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.