Логічні оператори

Логічні оператори зазвичай застосовуються до булевих (логічних) значень. В цьому випадку вони повертають значення типу Boolean. Однак, оператори && та || насправді повертають значення одного з заданих операндів, тому, якщо ці оператори використовуються зі значеннями не булевого типу, вони повернуть значення не булевого типу.

Опис

Логічні оператори описані у наведеній нижче таблиці (вирази expr можуть належати до будь-якого типу, не лише булевого):

Оператор Синтаксис Опис
Логічне І (&&) expr1 && expr2 Якщо вираз expr1 може бути приведений до true, вертає expr2; інакше, вертає expr1.
Логічне АБО (||) expr1 || expr2 Якщо вираз expr1 може бути приведений до true, вертає expr1; інакше, вертає expr2.
Логічне НЕ (!) !expr Вертає false, якщо його єдиний операнд може бути приведений до true; інакше, вертає true.

Якщо значення може бути приведене до true, то воно називається правдивим. Якщо значення може бути приведене до false, воно називається хибним.

Приклади виразів, які можуть бути приведені до false:

  • null;
  • NaN;
  • 0;
  • порожній рядок ("", або '', або ``);
  • undefined.

Хоча оператори && та || можуть використовуватись з операндами не булевого (логічного) типу, вони все одно можуть вважатися логічними операторами, оскільки значення, які вони повертають, завжди можуть бути приведені до булевих примітивів. Щоб явно перетворити повернені значення (або, взагалі, будь-який вираз) до відповідного булевого значення, скористайтесь подвійним оператором НЕ або конструктором Boolean.

Коротке замикання обчислення

Оскільки логічні вирази обчислюються зліва направо, вони перевіряються на можливе "коротке замикання" обчислення за наступними правилами:

  • (якийсь хибний вираз) && expr обчислюється як хибний вираз;
  • (якийсь правдивий вираз) || expr обчислюється як правдивий вираз.

Коротке замикання означає, що наведені вирази expr не обчислюються, тому будь-які побічні ефекти від цього не відбудуться (наприклад, якщо expr є викликом функції, виклик не відбувається). Це відбувається тому, що значення оператора вже визначене після обчислення першого операнду. Дивіться приклад:

function A(){ console.log('викликано A'); return false; }
function B(){ console.log('викликано B'); return true; }

console.log( A() && B() );
// виводить "викликано A" в результаті виклику функції,
// потім виводить false (що є результатом виклику оператора)

console.log( B() || A() );
// виводить "викликано B" в результаті виклику функції,
// потім виводить true (що є результатом виклику оператора)

Пріоритет операторів

Наступні вирази можуть виглядати еквівалентними, але це не так, оскільки оператор && виконується перед оператором || (дивіться Пріоритет операторів).

true || false && false      // вертає true, оскільки && виконується першим
(true || false) && false    // вертає false, оскільки не можна застосувати пріоритет операторів

Логічне І (&&)

Наступний код наводить приклади оператора && (логічне І).

a1 = true  && true       // t && t вертає true
a2 = true  && false      // t && f вертає false
a3 = false && true       // f && t вертає false
a4 = false && (3 == 4)   // f && f вертає false
a5 = 'Кіт' && 'Пес'      // t && t вертає "Пес"
a6 = false && 'Кіт'      // f && t вертає false
a7 = 'Кіт' && false      // t && f вертає false
a8 = ''    && false      // f && f вертає ""
a9 = false && ''         // f && f вертає false

Логічне АБО (||)

Наступний код наводить приклади оператора || (логічне АБО).

o1 = true  || true       // t || t вертає true
o2 = false || true       // f || t вертає true
o3 = true  || false      // t || f вертає true
o4 = false || (3 == 4)   // f || f вертає false
o5 = 'Кіт' || 'Пес'      // t || t вертає "Кіт"
o6 = false || 'Кіт'      // f || t вертає "Кіт"
o7 = 'Кіт' || false      // t || f вертає "Кіт"
o8 = ''    || false      // f || f вертає false
o9 = false || ''         // f || f вертає ""
o10 = false || varObject // f || object вертає varObject

Заувага: Якщо ви використовуєте цей оператор для присвоєння значення за замовчуванням якійсь змінній, пам'ятайте, що будь-яке хибне значення не буде використане. Якщо вам потрібно лише відфільтрувати null або undefined, розгляньте оператор null-об'єднання (однак, станом на листопад 2019 ця функціональність ще не була широко реалізована і має вважатися експериментальною, оскільки знаходиться на Стадії 3).

Логічне НЕ (!)

Наступний код демонструє приклади оператора ! (логічне НЕ).

n1 = !true               // !t вертає false
n2 = !false              // !f вертає true
n3 = !''                 // !f вертає true
n4 = !'Cat'              // !t вертає false

Подвійне НЕ (!!)

Можна використовувати пару операторів НЕ поспіль, щоб явно викликати перетворення будь-якої величини на відповідний булевий примітив. Перетворення базується на "правдивості" або "хибності" значення (дивіться truthy та falsy).

Таке саме перетворення можна виконати функцією Boolean.

n1 = !!true                   // !!truthy вертає true
n2 = !!{}                     // !!truthy вертає true: будь-який об'єкт є правдивим...
n3 = !!(new Boolean(false))   // ...навіть об'єкти Boolean з false .valueOf()!
n4 = !!false                  // !!falsy вертає false
n5 = !!""                     // !!falsy вертає false
n6 = !!Boolean(false)         // !!falsy вертає false

Правила перетворення для булевих значень

Перетворення І на АБО

Наступна операція з булевими значеннями:

умова1 && умова2

завжди дорівнює:

!(!умова1 || !умова2)

Перетворення АБО на І

Наступна операція з булевими значеннями:

умова1 || умова2

завжди дорівнює:

!(!умова1 && !умова2)

Перетворення НЕ

Наступна операція з булевими значеннями:

!!умова

завжди дорівнює:

умова

Прибирання вкладених дужок

Оскільки логічні вирази обчислюються зліва направо, завжди можна прибрати дужки зі складного виразу, дотримуючись деяких правил.

Прибирання вкладеного І

Наступна складена операція з булевими значеннями:

умова1 || (умова2 && умова3)

завжди дорівнює:

умова1 || умова2 && умова3

Прибирання вкладеного АБО

Наступна складена операція з булевими значеннями:

умова1 && (умова2 || умова3)

завжди дорівнює:

!(!умова1 || !умова2 && !умова3)

Специфікації

Специфікація Статус Коментар
ECMAScript 1st Edition (ECMA-262) Standard Початкове визначення.
ECMAScript 5.1 (ECMA-262) Standard Визначені у кількох розділах специфікації: Логічний оператор НЕ, Бінарні логічні оператори
ECMAScript 2015 (6th Edition, ECMA-262) Standard Визначені у кількох розділах специфікації: Логічний оператор НЕ, Бінарні логічні оператори
ECMAScript Latest Draft (ECMA-262) Draft Визначені у кількох розділах специфікації: Логічний оператор НЕ, Бінарні логічні оператори

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
Logical AND (&&)Chrome Full support 1Edge Full support 12Firefox Full support 1IE Full support 3Opera Full support YesSafari Full support YesWebView Android Full support 1Chrome Android Full support 18Firefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support 1.0nodejs Full support Yes
Logical OR (||)Chrome Full support 1Edge Full support 12Firefox Full support 1IE Full support 3Opera Full support YesSafari Full support YesWebView Android Full support 1Chrome Android Full support 18Firefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support 1.0nodejs Full support Yes
Logical NOT (!)Chrome Full support 1Edge Full support 12Firefox Full support 1IE Full support 3Opera Full support YesSafari Full support YesWebView Android Full support 1Chrome Android Full support 18Firefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support 1.0nodejs Full support Yes

Legend

Full support  
Full support

Див. також