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

Логический оператор ИЛИ (||) (дизъюнкция) для набора операндов истинен будет 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

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