У процесі розробки веб-додатків нерідко виникають ситуації, коли потрібно виконати один із багатьох варіантів коду залежно від значення конкретного виразу або змінної. Написання довгого ланцюжка з if...else if...else if робить код громіздким та складним для читання.
Інструкція switch у сучасному JavaScript (Vanilla JS) надає більш наочний, структурований та елегантний спосіб розгалуження коду за багатьма умовами.
1. Синтаксис та принципи роботи
Конструкція switch порівнює вираз, переданий у дужках, із варіантами значень в блоках case.
switch (вираз) {
case значення1:
// Код, що виконується, якщо вираз === значення1
break;
case значення2:
// Код, що виконується, якщо вираз === значення2
break;
default:
// Код, що виконується, якщо жоден case не підійшов
break;
}
Ключові особливості роботи:
- Суворе порівняння (Strict Equality): Перевірка здійснюється за допомогою суворого оператора
===. Це означає, що значення повинні збігатися не лише за вмістом, а й за типом даних. Рядок"5"та число5вважатимуться різними значеннями. - Оператор
break: Якщо прибратиbreak, виконання коду «провалиться» у наступний блокcaseнезалежно від того, чи збігається його значення, і продовжуватиметься до першогоbreakабо кінця блокуswitch. - Необов’язковий блок
default: Виконується тоді, коли жодне із значень уcaseне збіглося з переданим виразом. Його можна розміщувати у будь-якому місці блоку, але за традицією ставлять наприкінці.
2. Порівняльний аналіз: switch проти if…else if
| Критерій | Інструкція switch | Конструкція if…else if |
|---|---|---|
| Тип перевірок | Перевірка однієї змінної/виразу на точну рівність (===) із кількома фіксованими значеннями. |
Складні логічні умови (діапазони чисел, комбінації &&, ||, порівняння різних змінних). |
| Читабельність | Висока при великій кількості точних варіантів (список статусів, роль користувача, коди помилок). | Може перетворитися на «локшину» (spaghetti code) при глибині перевірок понад 3–4 рівня. |
| Групування | Легко групувати декілька case під один спільний блок коду. |
Вимагає дублювання умов або використання довгих умов з оператором ||. |
3. Практичні приклади використання в сучасному JavaScript
Приклад 1: Обробка ролей користувача та прав доступу
Класичний сценарій перевірки фіксованого значення атрибута (наприклад, роль у системі):
function getDashboardAccess(userRole) {
let accessLevel;
switch (userRole) {
case 'admin':
accessLevel = 'Повний доступ до панелі управління та налаштувань сервера.';
break;
case 'editor':
case 'author': // Групування кейсів: editor та author отримують однаковий доступ
accessLevel = 'Доступ до створення та редагування матеріалів.';
break;
case 'subscriber':
accessLevel = 'Доступ лише до читання закритих статей.';
break;
default:
accessLevel = 'Гостьовий доступ. Будь ласка, авторизуйтесь.';
break;
}
return accessLevel;
}
console.log(getDashboardAccess('author')); // "Доступ до створення та редагування матеріалів."
console.log(getDashboardAccess('guest')); // "Гостьовий доступ. Будь ласка, авторизуйтесь."
Приклад 2: Використання switch(true) для оцінки діапазонів значень
Незвичайний, але дуже популярний у сучасній розробці патерн: передача у switch значення true. Це дозволяє використовувати динамічні логічні вирази у блоках case:
function getDiscountByCartTotal(totalAmount) {
let discountPercent;
// Передаємо true у switch, щоб оцінювати булеві вирази в case
switch (true) {
case totalAmount >= 10000:
discountPercent = 15;
break;
case totalAmount >= 5000:
discountPercent = 10;
break;
case totalAmount >= 1000:
discountPercent = 5;
break;
case totalAmount > 0:
discountPercent = 0;
break;
default:
return 'Помилка: Сума замовлення повинна бути додатною.';
}
return `Ваша знижка: ${discountPercent}%`;
}
console.log(getDiscountByCartTotal(6500)); // "Ваша знижка: 10%"
console.log(getDiscountByCartTotal(-50)); // "Помилка: Сума замовлення повинна бути додатною."
Приклад 3: Область видимості змінних (Block Scope) всередині case
За замовчуванням весь switch має єдину спільну область видимості. Спроба оголосити змінну з однаковим ім’ям у різних case через const або let призведе до помилки SyntaxError. Для вирішення цього використовуються фігурні дужки {}:
const action = 'CREATE_USER';
switch (action) {
case 'CREATE_USER': { // Обмежуємо область видимості за допомогою блоку {}
const message = 'Створення нового користувача в базі...';
console.log(message);
break;
}
case 'DELETE_USER': { // Тепер можна безпечно використовувати те ж ім'я змінної message
const message = 'Видалення користувача...';
console.log(message);
break;
}
default:
console.log('Невідома дія.');
break;
}
Технічна порада розробника: Завжди пам’ятайте про суворе порівняння типів у
switch. Якщо ви отримуєте значення з HTML-форми або URL-параметрів (наприклад,const status = input.value), воно завжди матиме типString. Якщо у вашомуcase 1:вказано число, перевірка не спрацює. Перед передачею змінної уswitchявно приводьте її до потрібного типу (наприклад, черезNumber(status)абоparseInt(status, 10)).
switch – це потужний інструмент Vanilla JS для керування потоком виконання коду, коли потрібно вибрати один із багатьох варіантів за точним значенням. Використовуйте switch для роботи зі статусами, ролями, константами та кодами відповідей, пам’ятайте про break, ізолюйте область видимості за допомогою фігурних дужок – і ваш код стане чистішим та легшим у підтримці.