aboutsummaryrefslogtreecommitdiff
path: root/files/ru/web/javascript/reference/operators/logical_and/index.md
blob: 960d6ef3d12326cac62b1569ca4904339f75d0f8 (plain)
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
151
152
153
154
155
156
157
158
159
160
161
162
163
---
title: Логическое И (&&)
slug: Web/JavaScript/Reference/Operators/Logical_AND
tags:
  - JavaScript
  - Language feature
  - Logical Operator
  - Operator
  - Reference
browser-compat: javascript.operators.logical_and
---
{{jsSidebar("Operators")}}

Логический оператор И (`&&`) (конъюнкция) для набора операндов со значением типа {{jsxref("Boolean")}} будет `true` только в случае, если все операнды содержат значение `true`. В противном случае это будет `false`.

В целом, оператор вернёт значение первого {{Glossary("falsy", "ложноподобного")}} операнда при вычислении, либо значение последнего операнда, если все операнды оказались {{Glossary("truthy", "истиноподобными")}}.

{{EmbedInteractiveExample("pages/js/expressions-logical-and.html", "shorter")}}

## Синтаксис

```js
expr1 && expr2
```

## Описание

Логическое И (`&&`) вычисляет операнды слева направо, возвращая сразу значение первого попавшего {{Glossary("falsy", "ложноподобного")}} операнда; если все значения {{Glossary("truthy", "истиноподобны")}}, возвращается значение последнего операнда.

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

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

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

Оператор И возвращает небулевы значения как есть:

```js
result = '' && 'foo';  // result is assigned "" (empty string)
result = 2 && 0;       // result is assigned 0
result = 'foo' && 4;   // result is assigned 4
```

Несмотря на то, что оператор `&&` может использоваться с операндами, не содержащие логических значений, он всё равно останется булевым оператором, поскольку его возвращаемое значение всегда можно преобразовать в [булевый примитив](/ru/docs/Web/JavaScript/Data_structures#Boolean_type).
Чтобы явно преобразовать возвращаемое значение этого оператора (или вообще любое выражение) в соответствующее значение булевого типа, используйте двойной [`оператор НЕ`](/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT) или конструктор {{jsxref("Global_Objects/Boolean/Boolean", "Boolean")}}.

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

Оператор логического И вычисляет выражение по сокращённой схеме.
Каждый операнд приводится к булевому значению, если результат одного преобразования оказывается `false`, тогда оператор И останавливает дальнейшее вычисление выражения и возвращает исходное значение этого ложноподобного операнда. Поэтому оставшиеся операнды **не** будут вычислены.

В качестве примера рассмотрим следующий псевдокод.

```
(ложноподобное выражение) && следующее выражение
```

Поскольку первый операнд `(ложноподобное выражение)` имеет ложное значение, то `следующее выражение` **никогда не будет вычислено**.
Если `следующее выражение` содержало функцию, то она бы никогда не была вызвана.
Посмотрите пример ниже:

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

console.log( A() && B() );
// В результате вызова функции A, в консоли будет выведено "вызвана функция A",
// а оператор && вычислится как false (функция A возвращает false), поэтому далее в консоли появится false;
// вследствие этого оператор И прекратит вычисление и проигнорирует функцию B
```

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

Оператор И имеет более высокий приоритет, чем оператор ИЛИ, поэтому оператор `&&` выполнится раньше оператора `||` (см. [приоритет операторов](/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)).

```js
false || true && true            // вернёт true
true && (false || false)         // вернёт false
(2 == 3) || (4 < 0) && (1 == 1)  // вернёт false
```

## Примеры

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

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

```js
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
a8 = ''    && false      // f && f вернёт ""
a9 = false && ''         // f && f вернёт false
```

### Правила преобразования булевых значений

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

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

```js
bCondition1 && bCondition2
```

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

```js
!(!bCondition1 || !bCondition2)
```

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

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

```js
bCondition1 || bCondition2
```

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

```js
!(!bCondition1 && !bCondition2)
```

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

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

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

```js
bCondition1 || (bCondition2 && bCondition3)
```

это то же самое, что и:

```js
bCondition1 || bCondition2 && bCondition3
```

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

{{Specifications}}

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

{{Compat}}

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

- {{jsxref("Boolean")}}
- {{Glossary("Truthy")}}
- {{Glossary("Falsy")}}