Умовні вирази в JavaScript
Умовні вирази працюють з умовами - виразами, які повертають значення типу Boolean - true (умова не вірна) або false (умова не вірна). Є два типи умовних операцій: операції порівняння та логічні операції.
Операції порівняння
Оператори порівняння порівнюють два значення і повертають значення true або false:
- ==
Оператор рівності порівнює два значення, і якщо вони рівні, повертає true, інакше повертає false:x == 5 - ===
Оператор тотожності також порівнює два значення та їхній тип, і якщо вони рівні, повертає true, інакше повертає false:x === 5 - !=
Зрівнює два значення, і якщо вони не рівні, повертає true, інакше повертає false:x != 5 - !==
Зрівнює два значення та їхні типи, і якщо вони не рівні, повертає true, інакше повертає false:x !== 5 - >
Зрівнює два значення, і якщо перше більше другого, то повертає true, інакше повертає false:x > 5 - <
Порівнює два значення, і якщо перше менше другого, то повертає true, інакше повертає false:x < 5 - >=
Зрівнює два значення, і якщо перше більше або дорівнює другому, то повертає true, інакше повертає false:x >= 5 - <=
Зрівнює два значення, і якщо перше менше або дорівнює другому, то повертає true, інакше повертає false:x <= 5
Усі оператори досить прості, напевно, за винятком оператора рівності та оператора тотожності. Вони обидва порівнюють два значення, але оператор тотожності також бере до уваги і тип значення. Наприклад:
const income = 100;
const strIncome = "100"
const result = income == strIncome;
console.log(result); //true
Константа result тут дорівнюватиме true, оскільки фактично і income, і strIncome представляють число 100.
Але оператор тотожності поверне в цьому випадку false, оскільки дані мають різні типи:
const income = 100;
const strIncome = "100";
const result = income === strIncome;
console.log(result); // false
Аналогічно працюють оператори нерівності != і !==.
Логічні операції
Логічні операції зазвичай застосовуються до значень типу Boolean - true і false. Результат логічних операцій також зазвичай представляє значення типу Boolean - true або false. Часто цей вид операцій використовується для перевірки умов. У JavaScript є такі логічні операції:
Логічне І
Операція && повертає true, якщо обидва операнди повертають true, інакше повертає false:
console.log(true && true); // true
console.log(true && false); // false
console.log(false && false); // false
Нерідко цей тип операцій застосовується, якщо треба перевірити істинність двох умов, причому обидві умови мають бути істинними:
const money = 1000;
const age = 21;
// перевіряємо, що age більше 18 і money більше 100
const access1 = age > 18 && money > 100;
console.log(access1); // true
// перевіряємо, що age більше 18 і money більше 1000
const access2 = age > 18 && money > 1000;
console.log(access2);
У цьому випадку константа access1 дорівнюватиме true, якщо одночасно і age більше 18, і money більше 100. Тобто умовно кажучи, якщо людині більше 18 років, і в неї більше 100 грошових одиниць, то відкриваємо їй доступ. Тут обидві ці умови істинні, тому і access1 дорівнює true.
А ось константа access2 дорівнюватиме true, якщо одночасно і age більше 18, і money більше 1000. Тут друга умова не дотримується, вона хибна, тому і access2 дорівнює false.
Логічне АБО
Операція || повертає true, якщо хоча б один з операндів дорівнює true, інакше операція || повертає false:
console.log(true || true); // true
console.log(true || false); // true
console.log(false || false); // false
Ця операція також нерідко застосовується для перевірки двох умов, коли достатньо, щоб тільки одна умова була істинною, наприклад:
const money = 1000;
const age = 21;
// перевіряємо, що age більше 18 або money більше 1000
const access1 = age > 18 || money > 1000;
console.log(access1); // true
// перевіряємо, що age більше 22 або money більше 1000
const access2 = age > 22 || money > 1000;
console.log(access2); // false
У цьому випадку константа access1 дорівнюватиме true, якщо одночасно або age більше 18, або money більше 1000. Тобто умовно кажучи, якщо людині або більше 18 років, або у неї більше 1000 грошових одиниць, то відкриваємо їй доступ. Тобто достатньо істинності однієї умови. Тут перша умова істинна, тому і access1 дорівнює true.
А ось константа access2 дорівнюватиме true, якщо одночасно і age більше за 22, і money більше за 1000. Тут ні перша, ні друга умова не дотримуються, вони хибні, тому і access2 дорівнює false.
Логічне заперечення
Операція ! повертає true, якщо операнд дорівнює false, і повертає false, якщо операнд дорівнює true:
console.log(!true); // false
console.log(!false); // true
const isAlive = true;
const isDead = !isAlive;
console.log(isDead); // false
Логічні операції з довільними значеннями
Вище писалося, що логічні операції зазвичай як операндо приймають значення Boolean - true або false, а результатом операцій також зазвичай є значення Boolean. Але це зазвичай, у реальності ж операндами і результатами цих операцій можуть бути довільні значення. Іноді JavaScript може автоматично перетворити певні значення в тип Boolean:
| Значення | У що перетворюється |
| null | false |
| undefined | false |
| 0 (у тому числі значення NaN) | false |
| 1 (будь-яке ненульове значення) | true |
| "" (порожній рядок) | false |
| "деякий текст" (непорожній рядок) | true |
| {} (будь-який об'єкт) | true |
І якщо якісь операнди не є значенням Boolean, то в цьому випадку логічні операції діють відповідно до деяких плавилів.
Якщо як мінімум один операнд операції && не є значенням типу Boolean, то виконуються такі дії:
- якщо перший операнд повертає
false(наприклад, число 0, порожній рядок, null, undefined), то операція повертає перший операнд. - в інших випадках повертається другий операнд.
let isAlive; // невизначений
let name = "Tom";
const result = isAlive && name;
console.log(result);
Тут перший операнд операції && - змінна isAlive дорівнює undefined (оскільки змінна не ініціалізована), що при перетворенні до Boolean дасть false, тому операція поверне значення змінної isAlive.
Ще кілька прикладів:
console.log(false && "Tom"); // false
console.log("Tom" && null); // null
console.log(true && "Tom"); // Tom
Якщо один або обидва операнди операції || не є значеннями Boolean, то операція виконує такі дії:
- Якщо перший операнд оцінюється як true (тобто не дорівнює 0, порожньому рядку, null або undefined), то повертається перший операнд
- У всіх інших випадках повертається другий операнд
Приклади:
console.log(false || "Tom"); // Tom
console.log("Tom" || null); // Tom
console.log(true || "Tom"); // true
Якщо операнд операції заперечення ! не є значенням Boolean, то виконуються такі дії:
- Якщо операнд - порожній рядок, то повертається true, якщо рядок не порожній - то false
- Якщо операнд - число 0, то повертається true, для всіх інших чисел повертається false
- Якщо операнд - об'єкт, повертається false
- Якщо операнд - значення null, NaN і undefined, повертається true.
Приклади:
let isAlive; // невизначений
console.log(!isAlive); // true
console.log(!null); // true
console.log(!0); // true
console.log(!10); // false
console.log(!""); // true (порожній рядок)
console.log(!"Tom"); // false
Умовні конструкції
Вище ми розглянули, що логічні операції можуть набувати значень довільних типів, а не тільки Boolean. Здавалося б, у цьому немає особливого сенсу. Проте подібні конструкції можуть бути дуже зручними, коли нам треба перевірити умову і залежно від перевірки виконати ту чи іншу дію. Наприклад:
const age = 22;
age <= 17 && console.log("Вам менше 18 років. Доступ заборонено.");
age > 17 && console.log("Вам більше 17 років. Доступ дозволено.");
Тут залежно від значення константи age (яка представляє умовний вік) виводимо на консоль той чи інший рядок (умовно залежно від віку дозволяємо або забороняємо доступ). Нагадаю, що && повертає другий операнд, якщо перший дорівнює true. Спочатку виконується перша операція &&
age <= 17 && console.log("Вам менше 18 років. Доступ заборонено.");
Тут спочатку перевіряється перший операнд - вираз age <= 17. Якщо він істинний (тобто якщо age менше 18), то виконуємо метод console.log(). Однак оскільки умова з першого операнда НЕ вірна (оскільки age більше 17), то не буде виконувати другий операнд, і операція поверне false.
Аналогічно працює друга операція && за тим винятком, що вона перевіряє істинність виразу age > 17 (тобто age має бути більшим за 17)
age > 17 && console.log("Вам більше 17 років. Доступ дозволено.");
Тут же умова з першого операнда правильна, тому буде виконуватися другий операнд. У підсумку на консоль браузера буде виведено рядок
Вам більше 17 років. Доступ дозволено.
Аналогічно для побудови умовних конструкцій можна використовувати операцію ||, але вона повертає другий операнд, якщо перший операнд дорівнює false. Тобто виходить навпаки: операція && повертає другий операнд, якщо умова першого операнда вірна, а || - якщо умова не вірна. І ми могли б переписати попередній приклад за допомогою операції || таким чином:
const age = 12;
age <= 17 || console.log("Вам більше 17 років. Доступ дозволено.");
age > 17 || console.log("Вам менше 18 років. Доступ заборонено.");
Операції присвоювання
У JavaScript також є низка операцій, які поєднують логічні операції з присвоєнням:
- &&=
Аналогічно виконаннюa = a && b:let x =true;let y =false;y &&= x;console.log(y);// falselet c =false;let d =true;c &&= d;console.log(c);// falselet a =true;let b =true;a &&= b;console.log(a);// truelet e =false;let f =false;e &&= f;console.log(e);// false -
||=
a ||= bеквівалентно виразуa = a || b:let x =true;let y =false;y ||= x;console.log(y);// truelet a =true;let b =true;a ||= b;console.log(a);// truelet c =false;let d =true;c ||= d;console.log(c);// truelet e =false;let f =false;e ||= f;console.log(e);// false