Логічне АБО (||)
Оператор логічного АБО (||
) (логічна диз'юнкція) для набору булевих операндів буде true
тоді й лише тоді, коли один або більше операндів будуть true
. Його зазвичай застосовують щодо булевих (логічних) значень. У такому разі він повертає булеве значення. Однак насправді оператор ||
повертає значення одного з операндів, тож при використанні щодо небулевих значень він поверне небулеве значення.
Спробуйте його в дії
Синтаксис
x || y
Опис
Якщо x
можна перетворити на true
, повертає
x
; інакше – повертає y
.
Якщо значення може бути перетворено на true
, його називають істинним.
Якщо значення може бути перетворено на false
, його називають хибним.
Ось приклади виразів, які перетворюються на false
:
null
;NaN
;0
;- порожній рядок (
""
або''
або``
); undefined
.
Попри те, що оператор ||
може застосовуватися щодо небулевих операндів, він все одно вважається булевим, оскільки його повернене значення завжди може бути перетворено на булів примітив.
Щоб явно перетворити його повернене значення (або будь-який вираз загалом) на відповідне булеве значення, слід використати подвійний оператор НЕ або конструктор Boolean()
.
Закорочення обчислення
Вираз логічного АБО обчислюється зліва направо та перевіряється на можливість "закорочення обчислення" за допомогою наступного правила:
(якійсь істинний вираз) || вирз
закорочено обчислюється до true
.
Закорочене означає, що частина вирз
не обчислюється, тобто не трапляється ніяких побічних ефектів (якщо вирз
це функція, то вона ніколи не викликається). Це пов'язано з тим, що значення оператора очевидне вже після обчислення першого операнда. Погляньте на приклад:
function A() {
console.log("викликано A");
return false;
}
function B() {
console.log("викликано B");
return true;
}
console.log(B() || A());
// Виводить у консоль "викликано B" через виклик функції,
// а потім виводить true (що є результатом оператора)
Пріоритет операторів
Наступні вирази можуть здаватися еквівалентними, але це не так, оскільки оператор &&
виконується перед ||
(дивіться пріоритет операторів).
true || false && false; // повертає true, оскільки спочатку виконується &&
(true || false) && false; // повертає false, оскільки групування має найвищий пріоритет
Приклади
Застосування АБО
Наступний код демонструє приклади з оператором ||
(логічне АБО).
true || true; // t || t повертає true
false || true; // f || t повертає true
true || false; // t || f повертає true
false || 3 === 4; // f || f повертає false
"Кіт" || "Пес"; // t || t повертає "Кіт"
false || "Кіт"; // f || t повертає "Кіт"
"Кіт" || false; // t || f повертає "Кіт"
"" || false; // f || f повертає false
false || ""; // f || f повертає ""
false || varObject; // f || object повертає varObject
[!NOTE] Якщо ви використовуєте цей оператор для надання запасного значення якійсь змінній, майте на увазі, що будь-яке хибне значення не буде використано. Якщо потрібно фільтрувати лише
null
абоundefined
, розгляньте використання оператораnull
-злиття.
Правила перетворення булевих операцій
Перетворення І на АБО
Наступна операція над булевими:
bCondition1 && bCondition2
завжди рівносильна щодо:
!(!bCondition1 || !bCondition2)
Перетворення АБО на І
Наступна операція над булевими:
bCondition1 || bCondition2
завжди рівносильна щодо:
!(!bCondition1 && !bCondition2)
Вилучення вкладених дужок
Оскільки логічні вирази обчислюються зліва направо, завжди можна вилучити зі складного виразу дужки, якщо дотримано кількох правил.
Наступна складена операція над булевими:
bCondition1 || (bCondition2 && bCondition3)
завжди рівносильна щодо:
bCondition1 || bCondition2 && bCondition3
Специфікації
Сумісність із браузерами
desktop | mobile | server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Logical OR ( || )
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 3 | Opera Full support 3 | Safari Full support 1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |