Перейти к содержимому
Теория · Условия и циклы · урок 2 из 13

switch

В холле большого здания висит указатель: «Бухгалтерия — 3-й этаж, отдел кадров — 5-й этаж, столовая — 1-й этаж». Вы не обходите все этажи по очереди, а находите в указателе свою строку и сразу едете на нужный этаж.

Цепочка else if похожа на обход этажей. Когда одну переменную сравнивают с несколькими значениями, цепочка повторяет одно и то же сравнение в каждой ветке. Инструкция switch работает как указатель в холле: вычисляет выражение в скобках один раз и переходит к case с таким же значением:

JavaScript
const command = "stop";

switch (command) {
    case "start":
        console.log("Starting");
        break;
    case "stop":
        console.log("Stopping"); // Stopping
        break;
    default:
        console.log("Unknown command");
}

Давайте пройдём по программе:

  1. switch (command) вычисляет command и получает "stop".
  2. case "start": — значение не совпадает, эта ветка пропускается.
  3. case "stop": — совпадение, поэтому выполняется код под ним, и программа выводит Stopping.
  4. 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:.

JavaScript
const day = 6;

switch (day) {
    case 6:
    case 7:
        console.log("weekend"); // weekend
        break;
    default:
        console.log("workday");
}

Разберём, что происходит:

  1. day равен 6, поэтому выполнение начинается под case 6:.
  2. Под ним кода нет, и выполнение проваливается в case 7:, не сравнивая 6 с 7.
  3. console.log("weekend") выводит weekend, а break завершает switch.

При day, равном 6 или 7, программа выводит weekend, при любом другом значении — workday.

Здесь аналогия с указателем перестаёт работать. В указателе каждая строка отдельна, а в switch ветки идут подряд, и без break выполнение перетекает в следующую.

Сравнение через ===

switch сравнивает значение с каждым case строгим равенством ===, без приведения типов. На собеседовании об этом спрашивают часто: строка "2" не равна числу 2, поэтому здесь выполняется default:

JavaScript
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:

JavaScript
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 и подпишись на канал — откроются все уроки.

Войти другим способом