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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
|
---
title: Логические операторы
slug: Web/JavaScript/Reference/Operators/Логические_операторы
translation_of: Web/JavaScript/Reference/Operators
translation_of_original: Web/JavaScript/Reference/Operators/Logical_Operators
---
<div>{{jsSidebar("Operators")}}</div>
<div>Логические операторы используются, как правило, с примитивами {{jsxref("Boolean")}} (логического) типа. В этом случае результатом работы оператора является значение типа Boolean. Между тем операторы && и || возвращают, вообще говоря, значение одного из операнда, потому при использовании в качестве аргументов этих операторов величин, тип которых отличен от Boolean, тип возвращаемого значения может быть отличным от Boolean.</div>
<div></div>
<h2 id="Описание">Описание</h2>
<p>В таблице приведены описания логических операторов:</p>
<table class="fullwidth-table">
<tbody>
<tr>
<th>Оператор</th>
<th>Использование</th>
<th>Описание</th>
</tr>
<tr>
<td>Логическое И (&&)</td>
<td><code><em>expr1</em> && <em>expr2</em></code></td>
<td>Возвращает значение <code>expr1</code>, если оно может быть преобразовано в false; иначе возвращает значение <code>expr2</code>. Таким образом, при использовании с величинами типа Boolean оператор && вернет true, если оба операнда могут быть преобразованы в true; иначе оператор && вернет false. </td>
</tr>
<tr>
<td>Логическое ИЛИ (<code>||</code>)</td>
<td><code><em>expr1</em> || <em>expr2</em></code></td>
<td>
<p>Возвращает значение <code>expr1</code>, если оно может быть преобразовано в true; иначе возвращает значение <code>expr2.</code> Таким образом, при использовании с величинами типа Boolean оператор <code>||</code> вернет <code>true</code> если хоть один из них равен <code>true</code>; в других случаях вернет <code>false</code>.</p>
</td>
</tr>
<tr>
<td>Логическое НЕ (<code>!</code>)</td>
<td><code>!<em>expr</em></code></td>
<td>Возвращает false если значение <code>expr </code>можно<font face="Consolas, Liberation Mono, Courier, monospace"> </font>привести к <code>true</code>; в противоположном случае возвращает <code>true</code>.</td>
</tr>
</tbody>
</table>
<p>Примеры значений выражений, которые могут быть преобразованы в <code>false</code>:</p>
<ul>
<li><code>null</code>;</li>
<li><code>NaN;</code></li>
<li><code>0</code>;</li>
<li>пустая строка (<code>""</code>); </li>
<li><code>undefined</code>.</li>
</ul>
<p>Хоть операторы <code>&&</code> и <code>||</code> могут использовать операнды с не булевыми значениями, но они всёравно рассматриваются, как булевы операторы, т.к. их возвращаемые ими значения всегда могут быть сконвертированы в булевы значения.</p>
<h3 id="Короткая_схема_вычислений">Короткая схема вычислений</h3>
<p>Так как логические операторы выполняются слева направо, они проверяются на "короткие вычисления" по следующим правилам:</p>
<ul>
<li><code>false && (<em>anything)</em></code> короткое вычисление дающее false.</li>
<li><code>true || (<em>anything)</em></code> короткое замыкание дающее true.</li>
</ul>
<p>Часть выражения <code>(<em>anything)</em></code> не вычисляется. Если в ней есть вызов функции, то эта функция не будет вызвана.</p>
<p>Например, следующие две функции делают одно и тоже:</p>
<pre class="brush: js">function shortCircuitEvaluation() {
doSomething() || doSomethingElse()
}
function equivalentEvaluation() {
var flag = doSomething();
if (!flag) {
doSomethingElse();
}
}
</pre>
<p>Однако, следующие выражения дают разный результат в связи с <a href="/ru/docs/Web/JavaScript/Reference/Operators/Operator_Precedence">приоритетом операторов</a>.</p>
<pre class="brush: js">false && true || true // вернёт true
false && (true || true) // вернёт false</pre>
<h3 id="Логическое_И"><a name="Logical_AND">Логическое И (<code>&&</code>)</a></h3>
<p>Следующий код показывает пример оператора <code>&&</code> (логическое И).</p>
<pre class="brush: 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
</pre>
<h3 id="Логическое_ИЛИ"><a name="Logical_OR">Логическое ИЛИ (<code>||</code>)</a></h3>
<p>Это код представляет собой пример оператора <code>||</code> (логическое ИЛИ).</p>
<pre class="brush: 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"
</pre>
<h3 id="Логическое_НЕ_!"><a name="Logical_NOT">Логическое НЕ (<code>!</code>)</a></h3>
<p>Следующий код является примером оператора <code>!</code> (логическое НЕ).</p>
<pre class="brush: js">n1 = !true // !t вернёт false
n2 = !false // !f вернёт true
n3 = !"Cat" // !t вернёт false
</pre>
<h3 id="Правила_преобразования">Правила преобразования</h3>
<h4 id="Конвертирование_И_в_ИЛИ">Конвертирование И в ИЛИ</h4>
<p>следующая операция использует булев тип:</p>
<pre class="brush: js">bCondition1 && bCondition2</pre>
<p>это всегда равно:</p>
<pre class="brush: js">!(!bCondition1 || !bCondition2)</pre>
<h4 id="Конвертирование_ИЛИ_в_И">Конвертирование ИЛИ в И</h4>
<p>эта операция использует булев тип:</p>
<pre class="brush: js">bCondition1 || bCondition2</pre>
<p>что эквивалентно:</p>
<pre class="brush: js">!(!bCondition1 && !bCondition2)</pre>
<h4 id="Конвертирование_многих_НЕ">Конвертирование многих НЕ</h4>
<p>следующая операция использует булев тип:</p>
<pre class="brush: js">!!bCondition</pre>
<p>что равно:</p>
<pre class="brush: js">bCondition</pre>
<h3 id="Удаление_вложенных_скобок">Удаление вложенных скобок</h3>
<p>Так как логические выражения выполняются слева направо, становится возможным удалить круглые скобки из комплексного выражения, следуя следующим правилам.</p>
<h4 id="Удаление_вложенных_И">Удаление вложенных И</h4>
<p>Это составное выражение использует булев тип:</p>
<pre class="brush: js">bCondition1 || (bCondition2 && bCondition3)</pre>
<p>что будет равным:</p>
<pre class="brush: js">bCondition1 || bCondition2 && bCondition3</pre>
<h4 id="Удаление_вложенного_ИЛИ">Удаление вложенного ИЛИ</h4>
<p>Следующее составное выражение использует булев тип:</p>
<pre class="brush: js">bCondition1 && (bCondition2 || bCondition3)</pre>
<p>всегда равно:</p>
<pre class="brush: js">!(!bCondition1 || !bCondition2 && !bCondition3)</pre>
<h2 id="Спецификации">Спецификации</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Спецификация</th>
<th scope="col">Статус</th>
<th scope="col">Комментарий</th>
</tr>
<tr>
<td>{{SpecName('ES5.1')}}</td>
<td>{{Spec2('ES1')}}</td>
<td>Изначальное определение</td>
</tr>
<tr>
<td>{{SpecName('ES5.1', '#sec-11.11')}}</td>
<td>{{Spec2('ES5.1')}}</td>
<td>Определено в нескольких секциях спецификации: <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.4.9">Логический оператор НЕ</a>, <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.11">Бинарные логические операторы</a></td>
</tr>
<tr>
<td>{{SpecName('ES6', '#sec-binary-logical-operators')}}</td>
<td>{{Spec2('ES6')}}</td>
<td>Определено в нескольких секциях спецификации: <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.4.9">Логический оператор НЕ</a>, <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.11">Бинарные логические операторы</a></td>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-binary-logical-operators')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td>Определено в нескольких секциях спецификации: <a href="http://tc39.github.io/ecma262/#sec-logical-not-operator">Логический оператор НЕ</a>, <a href="http://tc39.github.io/ecma262/#sec-binary-logical-operators">Бинарные логические операторы</a></td>
</tr>
</tbody>
</table>
<h2 id="Поддержка_браузерами">Поддержка браузерами</h2>
<p>{{CompatibilityTable}}</p>
<div id="compat-desktop">
<table class="compat-table">
<tbody>
<tr>
<th>Возможность</th>
<th>Chrome</th>
<th>Firefox (Gecko)</th>
<th>Internet Explorer</th>
<th>Opera</th>
<th>Safari</th>
</tr>
<tr>
<td><a href="#Logical_AND">Логическое И (<code>&&</code>)</a></td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
</tr>
<tr>
<td><a href="#Logical_OR">Логическое ИЛИ (<code>||</code>)</a></td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
</tr>
<tr>
<td><a href="#Logical_NOT">Логическое НЕ (<code>!</code>)</a></td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
</tr>
</tbody>
</table>
</div>
<div id="compat-mobile">
<table class="compat-table">
<tbody>
<tr>
<th>Возможность</th>
<th>Android</th>
<th>Chrome for Android</th>
<th>Firefox Mobile (Gecko)</th>
<th>IE Mobile</th>
<th>Opera Mobile</th>
<th>Safari Mobile</th>
</tr>
<tr>
<td><a href="#Logical_AND">Логическое И (<code>&&</code>)</a></td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
</tr>
<tr>
<td><a href="#Logical_OR">Логическое ИЛИ (<code>||</code>)</a></td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
</tr>
<tr>
<td><a href="#Logical_NOT">Логическое НЕ (<code>!</code>)</a></td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
</tr>
</tbody>
</table>
</div>
<h2 id="Смотрите_также">Смотрите также</h2>
<ul>
<li><a href="/ru/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators">Битовые операторы</a></li>
<li><a href="/ru/docs/Web/JavaScript/Reference/Global_Objects/Boolean">Boolean</a></li>
</ul>
|