Логическое ИЛИ (||)

Логический оператор ИЛИ (||) (дизъюнкция) для набора операндов истинен будет true только в случае, если один или несколько его операндов имеют значение true.

Обычно используется с булевыми (логическими) значениями. Тогда возвращается булевое значение. Однако фактически оператор || возвращает значение одного из операндов, поэтому если этот оператор используется с небулевыми значениями, он вернет небулевое значение.

Интерактивный пример

Синтаксис

js
expr1 || expr2;

Описание

Если expr1 может быть преобразовано в true, то вернётся expr1; в противном случае возвращается expr2.

Если значение может быть преобразовано в true, то оно рассматривается как истиноподобное (truthy). Если же значение может быть преобразовано в false, то оно называется ложноподобным (falsy).

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

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

Несмотря на то, что оператор || может использоваться с операндами без логических значений, это всё равно булевый оператор, поскольку его возвращаемое значение всегда можно преобразовать в булевый примитив. Чтобы явно преобразовать возвращаемое значение этого оператора (или вообще любое выражение) в соответствующее значение булевого типа, используйте двойной оператор НЕ или конструктор Boolean (en-US).

Сокращённое вычисление

Оператор логического ИЛИ вычисляется слева направо, делая возможным сокращённое вычисление выражения, согласно следующему правилу:

(истинноподобное выражение) || следующее выражение — вычисление останавливается на истинноподобном выражении;

Сокращенное вычисление хорошо тем, что следующее выражение не будет вычислено, т.е. всё, связанное с ним, будет проигнорировано (например, если следующее выражение представляет собой вызов функции, то он никогда не произойдёт). Всё потому, что значение оператора известно уже после вычисления первого операнда. Посмотрите на пример:

js
function A() {
  console.log("вызвана функция A");
  return false;
}
function B() {
  console.log("вызвана функция B");
  return true;
}

console.log(B() || A());
// В результате вызова функции B, в консоли будет выведено "вызвана функция B",
// а далее в консоли появится false (это результат оператора)

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

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

js
true || (false && false); // вернёт true, поскольку сначала вычисляется &&
(true || false) && false; // вернёт false, поскольку у группировки выше приоритет

Примеры

Использование оператора ИЛИ

В следующем коде показаны примеры использования оператора || (логическое ИЛИ).

js
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"
o8 = "" || false; // f || f вернёт false
o9 = false || ""; // f || f вернёт ""
o10 = false || varObject; // f || object вернёт varObject

Примечание: Если вы используете этот оператор, чтобы задать значение по умолчанию для некоторой переменной, имейте в виду, что любое ложноподобное будет проигнорировано. Если вам нужно исключить только null или undefined, попробуйте воспользоваться оператором нулевого слияния.

Правила конвертации для булевых значений

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

Следующая операция с булевыми значениями:

js
bCondition1 && bCondition2;

всегда эквивалентна:

js
!(!bCondition1 || !bCondition2);

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

Следующая операция с булевыми значениями:

js
bCondition1 || bCondition2;

всегда эквивалентна:

js
!(!bCondition1 && !bCondition2);

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

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

Следующая составная операция с булевыми значениями:

js
bCondition1 && (bCondition2 || bCondition3);

всегда эквивалентна:

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

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

Specification
ECMAScript Language Specification
# prod-LogicalORExpression

Совместимость с браузерами

BCD tables only load in the browser

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