Learning Book

switch / case

switch / case

switch — альтернатива длинным if/else if цепочкам, когда нужно сравнить одну переменную с множеством значений.

Синтаксис

const day = 'Monday';

switch (day) {
  case 'Monday':
    console.log('Понедельник');
    break; // Без break — выполнение "провалится" в следующий case!
  case 'Tuesday':
    console.log('Вторник');
    break;
  default:
    console.log('Другой день');
}

Fall-through — намеренный и случайный

Fall-through (проваливание) происходит когда break отсутствует:

// Случайный fall-through — баг!
switch (status) {
  case 'active':
    activateUser(); // Если забыть break — выполнится и deactivateUser!
  case 'inactive':
    deactivateUser();
    break;
}

// Намеренный fall-through — несколько case с одним действием
switch (day) {
  case 'Saturday':
  case 'Sunday':
    console.log('Выходной'); // Оба case ведут сюда
    break;
  default:
    console.log('Рабочий день');
}
Всегда заканчивайте каждый case оператором break, return или throw. Намеренный fall-through документируйте комментарием // falls through.

switch использует строгое сравнение ===

const value = '1'; // Строка '1'

switch (value) {
  case 1:        // Число 1 — НЕ совпадёт! switch использует ===
    console.log('число один');
    break;
  case '1':      // Строка '1' — совпадёт
    console.log('строка один');
    break;
}

Когда использовать switch vs if/else

switch подходит когда:

  • Одна переменная сравнивается с несколькими конкретными значениями
  • Много вариантов (4+) — switch читается чище
  • Нужен fall-through для группировки случаев

if/else лучше когда:

  • Условие — диапазон (score > 80)
  • Условия разнородные и не связаны
  • Мало вариантов (2-3)
// Хорошо для switch
switch (httpMethod) {
  case 'GET': handleGet(); break;
  case 'POST': handlePost(); break;
  case 'PUT': handlePut(); break;
  case 'DELETE': handleDelete(); break;
  default: handleUnknown();
}

// Плохо для switch — диапазоны, лучше if/else
if (score >= 90) { grade = 'A'; }
else if (score >= 80) { grade = 'B'; }

В функциях вместо break можно использовать return:

function getDayType(day) {
  switch (day) {
    case 'Saturday':
    case 'Sunday':
      return 'weekend';
    case 'Monday':
    case 'Friday':
      return 'workday';
    default:
      return 'workday';
  }
}

Это избавляет от необходимости в break и делает код чище.