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

Логический оператор ИЛИ (`||`) (дизъюнкция) для набора операндов истинен будет `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 with JavaScript enabled. Enable JavaScript to view data.

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

* Оператор нулевого слияния (`??`)
* `Boolean`
* Truthy
* Falsy