Умовні конструкції
Умовні конструкції в JavaScript, це способи виконати різні гілки коду залежно від значення виразу: if / else if / else, тернарний оператор ? :, switch і логічні скорочення &&, ||, ??. Усі вони роблять одне й те саме розгалуження, але відрізняються читабельністю й тим, чи повертають значення.
Теорія
TL;DR
if / else if / else, основна конструкція, умова зводиться до булевого значення (truthy/falsy).- Тернарний оператор
умова ? a : b, це вираз, тому його результат можна присвоїти. switchпорівнює один вираз із наборомcaseстрогою рівністю===;breakзапобігає провалюванню,default, це аналогelse.&&виконує праву частину, лише якщо ліва truthy.||повертає перше truthy значення, зручно для дефолтів.??підставляє значення лише дляnullтаundefined, на відміну від||.
Швидкий приклад
const age = 20;
if (age >= 18) {
console.log('Дорослий');
} else if (age >= 14) {
console.log('Підліток');
} else {
console.log('Дитина');
}ifперевіряє умову.else ifдодає додаткові перевірки.elseвиконується, якщо жодна з попередніх не спрацювала.
Умова всередині
ifзводиться до булевого значення (truthy/falsy).
Тернарний оператор ? :
Короткий запис для простих умов, який, на відміну від if, є виразом і повертає значення.
const age = 18;
const status = age >= 18 ? 'Дорослий' : 'Неповнолітній';
console.log(status); // "Дорослий"Синтаксис: умова ? значення_якщо_істина : значення_якщо_хиба.
Кілька тернарних операторів можна вкладати один в одний, але обережно з читабельністю:
const age = 25;
const group =
age < 13 ? 'дитина' :
age < 20 ? 'підліток' :
'дорослий';Оператор switch
Зручний, коли варіантів одного й того самого виразу багато.
const day = 3;
switch (day) {
case 1:
console.log('Понеділок');
break;
case 2:
console.log('Вівторок');
break;
case 3:
console.log('Середа');
break;
default:
console.log('Невідомий день');
}breakзапобігає «провалюванню» в наступнийcase.default, це аналогelse.
Можна використовувати групування гілок:
switch (day) {
case 6:
case 7:
console.log('Вихідний');
break;
default:
console.log('Робочий день');
}Важлива деталь: switch порівнює значення строгою рівністю ===, тому switch ('3') не потрапить у case 3.
Логічні оператори &&, ||, ??
Іноді if можна замінити логічними скороченнями.
&&, «і» (виконує другу частину, якщо перша truthy)
const isAdmin = true;
isAdmin && console.log('Ласкаво просимо, адміне!');Якщо isAdmin === true, то виконається console.log.
||, «або» (повертає перше truthy значення)
const userName = '' || 'Гість';
console.log(userName); // "Гість"Зручно для значень за замовчуванням.
??, nullish coalescing (лише для null та undefined)
const userInput = null;
const value = userInput ?? 'За замовчуванням';
console.log(value); // "За замовчуванням"Відмінність від ||: не спрацьовує на 0, '', false.
Порівняння конструкцій
| Конструкція | Це вираз? | Коли доречна |
|---|---|---|
if / else if / else | ні | складна логіка з тілом гілки |
? : | так | короткий вибір одного з двох значень |
switch | ні | багато варіантів одного виразу, порівняння через === |
&&, ||, ?? | так | коротка перевірка та значення за замовчуванням |
Типові помилки
- Плутати
=і===в умові.if (x = 5)присвоює значення і завжди дає truthy. - Забувати
breakуswitch. Виконання «провалюється» в наступні гілки, і спрацьовує кількаcaseпоспіль. - Розраховувати на нестрогу рівність у
switch. Порівняння строге, тому'3'і3це різні гілки. - Використовувати
||для дефолтів там, де0чи''є коректними значеннями.count || 10перетворить справжній0на10; тут потрібен??. - Вкладати тернарні оператори на три й більше рівнів. Технічно це працює, але читати такий код важко, краще
ifабо таблиця відповідностей (об'єкт). - Змішувати
??з||чи&&без дужок. ЦеSyntaxError, потрібні явні дужки.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.