Умовні вирази в 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);
// false
let c =
false
;
let d =
true
;
c &&= d;
console.log(c);
// false
let a =
true
;
let b =
true
;
a &&= b;
console.log(a);
// true
let 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);
// true
let a =
true
;
let b =
true
;
a ||= b;
console.log(a);
// true
let c =
false
;
let d =
true
;
c ||= d;
console.log(c);
// true
let e =
false
;
let f =
false
;
e ||= f;
console.log(e);
// false