1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
---
title: Логическое ИЛИ (||)
slug: Web/JavaScript/Reference/Operators/Logical_OR
tags:
- JavaScript
- Language feature
- Logical Operator
- Operator
- Reference
browser-compat: javascript.operators.logical_or
---
{{jsSidebar("Operators")}}
Логический оператор ИЛИ (`||`) (дизъюнкция) для набора операндов истинен будет `true` только в случае, если один или несколько его операндов имеют значение `true`.
Обычно используется с {{jsxref("Boolean", "булевыми")}} (логическими) значениями. Тогда возвращается булевое значение. Однако фактически оператор `||` возвращает значение одного из операндов, поэтому если этот оператор используется с небулевыми значениями, он вернет небулевое значение.
{{EmbedInteractiveExample("pages/js/expressions-logical-or.html", "shorter")}}
## Синтаксис
```js
expr1 || expr2
```
## Описание
Если `expr1` может быть преобразовано в `true`, то вернётся `expr1`; в противном случае возвращается `expr2`.
Если значение может быть преобразовано в `true`, то оно рассматривается как {{Glossary("truthy", "истиноподобное (truthy)")}}. Если же значение может быть преобразовано в `false`, то оно называется {{Glossary("falsy", "ложноподобным (falsy)")}}.
Примеры выражений, которые могут быть преобразованы в `false`:
- `null`;
- `NaN`;
- `0`;
- пустая строка (`""`, `''`, ` `` `);
- `undefined`.
Несмотря на то, что оператор `||` может использоваться с операндами без логических значений, это всё равно булевый оператор, поскольку его возвращаемое значение всегда можно преобразовать в [булевый примитив](/ru/docs/Web/JavaScript/Data_structures#Boolean_type).
Чтобы явно преобразовать возвращаемое значение этого оператора (или вообще любое выражение) в соответствующее значение булевого типа, используйте двойной {{JSxRef("Operators/Logical_NOT", "оператор НЕ")}} или конструктор {{jsxref("Global_Objects/Boolean/Boolean", "Boolean")}}.
### Сокращённое вычисление
Оператор логического ИЛИ вычисляется слева направо, делая возможным сокращённое вычисление выражения, согласно следующему правилу:
`(истинноподобное выражение) || следующее выражение` — вычисление останавливается на истинноподобном выражении;
Сокращенное вычисление хорошо тем, что `следующее выражение` не будет **вычислено**, т.е. всё, связанное с ним, будет проигнорировано (например, если
`следующее выражение` представляет собой вызов функции, то он никогда не произойдёт). Всё потому, что значение оператора известно уже после вычисления первого операнда. Посмотрите на пример:
```js
function A(){ console.log('вызвана функция A'); return false; }
function B(){ console.log('вызвана функция B'); return true; }
console.log( B() || A() );
// В результате вызова функции B, в консоли будет выведено "вызвана функция B",
// а далее в консоли появится false (это результат оператора)
```
### Приоритет операторов
Следующие выражения могут показаться эквивалентными, но это не так, потому что оператор `&&` выполняется до оператора `||` (см. [приоритет операторов](/ru/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)).
```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
```
> **Примечание:** Если вы используете этот оператор, чтобы задать значение по умолчанию для некоторой переменной, имейте в виду, что любое _ложноподобное_ будет проигнорировано. Если вам нужно исключить только {{jsxref("null")}} или {{jsxref("undefined")}}, попробуйте воспользоваться [оператором нулевого слияния](/ru/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator).
### Правила конвертации для булевых значений
#### Конвертация И в ИЛИ
Следующая операция с **булевыми значениями**:
```js
bCondition1 && bCondition2
```
всегда эквивалентна:
```js
!(!bCondition1 || !bCondition2)
```
#### Конвертация ИЛИ в И
Следующая операция с **булевыми значениями**:
```js
bCondition1 || bCondition2
```
всегда эквивалентна:
```js
!(!bCondition1 && !bCondition2)
```
### Удаление вложенных круглых скобок
Поскольку логические выражения вычисляются слева направо, всегда можно удалить круглые скобки из сложного выражения при условии соблюдения определенных правил.
Следующая составная операция с **булевыми значениями**:
```js
bCondition1 && (bCondition2 || bCondition3)
```
всегда эквивалентна:
```js
!(!bCondition1 || !bCondition2 && !bCondition3)
```
## Спецификации
{{Specifications}}
## Поддержка браузерами
{{Compat}}
## Смотрите также
- [Оператор нулевого слияния (`??`)](/ru/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator)
- {{jsxref("Boolean")}}
- {{Glossary("Truthy")}}
- {{Glossary("Falsy")}}
|