MDN wants to learn about developers like you: https://qsurvey.mozilla.com/s3/MDN-dev-survey

Логические операторы используются, как правило, с примитивами 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.

Правила логики гарантируют, что эти выражения всегда корректны. Заметьте, что любая часть выражений ниже не выполнится, так как любые побочные эффекты не сделают эффекта. Также заметьте, что любая часть выражения ниже - одиночное логическое выражение (отмечено скобками).

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

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 Latest Draft (ECMA-262) Черновик Определено в нескольких секциях спецификации: Логический оператор НЕ, Бинарные логические операторы

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

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

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

Метки документа и участники

 Внесли вклад в эту страницу: BychekRU, Frenk1, alexbaumgertner, SergeyShpak
 Обновлялась последний раз: BychekRU,