Логические операторы

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

Описание

В таблице приведены описания логических операторов:

Оператор Использование Описание
Логическое И (&&) expr1 && expr2 Возвращает значение expr1, если оно может быть преобразовано в false; иначе возвращает значение expr2. Таким образом, при использовании с величинами типа Boolean оператор && вернёт true, если оба операнда могут быть преобразованы в true; иначе оператор && вернёт false. 
Логическое ИЛИ (||) expr1 || expr2

Возвращает значение expr1, если оно может быть преобразовано в true; иначе возвращает значение expr2. Таким образом, при использовании с величинами типа Boolean оператор || вернёт true если хоть один из них равен true; в других случаях вернёт false.

Логическое НЕ (!) !expr Возвращает false если значение expr можно привести к true;  в противоположном случае возвращает true.

Примеры значений выражений, которые могут быть преобразованы в false:

  • null;
  • NaN;
  • 0;
  • пустая строка (""); 
  • undefined.

Хоть операторы && и || могут использовать операнды с не булевыми значениями, но они всё равно рассматриваются, как булевы операторы, т.к. их возвращаемые ими значения всегда могут быть сконвертированы в булевы значения.

Короткая схема вычислений

Так как логические операторы выполняются слева направо, они проверяются на "короткие вычисления" по следующим правилам:

  • false && (anything) короткое вычисление дающее false.
  • true || (anything) короткое замыкание дающее true.

Часть выражения (anything) не вычисляется. Если в ней есть вызов функции, то эта функция не будет вызвана.

Например, следующие две функции делают одно и тоже:

function shortCircuitEvaluation() {
  doSomething() || doSomethingElse()
}

function equivalentEvaluation() {
  var flag = doSomething();
  if (!flag) {
    doSomethingElse();
  }
}

Однако, следующие выражения дают разный результат в связи с приоритетом операторов.

false && true  || true      // вернёт true
false && (true || true)     // вернёт 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 = "Cat" && "Dog"     // t && t вернёт "Dog"
a6 = false && "Cat"     // f && t вернёт false
a7 = "Cat" && false     // t && 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 = "Cat" || "Dog"      // t || t вернёт "Cat"
o6 = false || "Cat"      // f || t вернёт "Cat"
o7 = "Cat" || false      // t || f вернёт "Cat"

Логическое НЕ (!)

Следующий код является примером оператора ! (логическое НЕ).

n1 = !true              // !t вернёт false
n2 = !false             // !f вернёт true
n3 = !"Cat"             // !t вернёт false

Правила преобразования

Конвертирование И в ИЛИ

следующая операция использует булев тип:

bCondition1 && bCondition2

это всегда равно:

!(!bCondition1 || !bCondition2)

Конвертирование ИЛИ в И

эта операция использует булев тип:

bCondition1 || bCondition2

что эквивалентно:

!(!bCondition1 && !bCondition2)

Конвертирование многих НЕ

следующая операция использует булев тип:

!!bCondition

что равно:

bCondition

Удаление вложенных скобок

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

Удаление вложенных И

Это составное выражение использует булев тип:

bCondition1 || (bCondition2 && bCondition3)

что будет равным:

bCondition1 || bCondition2 && bCondition3

Удаление вложенного ИЛИ

Следующее составное выражение использует булев тип:

bCondition1 && (bCondition2 || bCondition3)

всегда равно:

!(!bCondition1 || !bCondition2 && !bCondition3)

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

Спецификация Статус Комментарий
ECMAScript 5.1 (ECMA-262) Стандарт Изначальное определение
ECMAScript 5.1 (ECMA-262) Стандарт Определено в нескольких секциях спецификации: Логический оператор НЕ, Бинарные логические операторы
ECMAScript 2015 (6th Edition, ECMA-262) Стандарт Определено в нескольких секциях спецификации: Логический оператор НЕ, Бинарные логические операторы
ECMAScript (ECMA-262) Живой стандарт Определено в нескольких секциях спецификации: Логический оператор НЕ, Бинарные логические операторы

Поддержка браузерами

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help! (en-US)

Возможность Chrome Firefox (Gecko) Internet Explorer Opera Safari
Логическое И (&&) (Да) (Да) (Да) (Да) (Да)
Логическое ИЛИ (||) (Да) (Да) (Да) (Да) (Да)
Логическое НЕ (!) (Да) (Да) (Да) (Да) (Да)
Возможность Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Логическое И (&&) (Да) (Да) (Да) (Да) (Да) (Да)
Логическое ИЛИ (||) (Да) (Да) (Да) (Да) (Да) (Да)
Логическое НЕ (!) (Да) (Да) (Да) (Да) (Да) (Да)

Смотрите также