aboutsummaryrefslogtreecommitdiff
path: root/files/uk/web/javascript/reference/operators/logical_and/index.html
blob: c8d1ccaae68f4cab59e9a2eac42a1b4beddd553d (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
---
title: Логічне І (&&)
slug: Web/JavaScript/Reference/Operators/Logical_AND
tags:
  - JavaScript
  - Довідка
  - Логічний оператор
  - Оператор
translation_of: Web/JavaScript/Reference/Operators/Logical_AND
---
<div>{{jsSidebar("Operators")}}</div>

<p>Логічний оператор І (<code>&amp;&amp;</code>) (логічна кон'юнкція) для набору операндів дорівнює true тільки тоді, коли усі його операнди дорівнюють true. Він зазвичай використовується з {{jsxref("Boolean","булевими")}} (логічними) значеннями. У цьому випадку він повертає булеве значення. Однак, оператор <code>&amp;&amp;</code> насправді повертає значення одного з наданих операндів, а отже, якщо цей оператор застосовується не з булевими значеннями, він поверне не булеве значення.</p>

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

<div class="hidden">The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone <a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a> and send us a pull request.</div>

<h2 id="Синтаксис">Синтаксис</h2>

<pre class="syntaxbox notranslate"><em>вираз1</em> &amp;&amp; <em>вираз2</em>
</pre>

<h2 id="Опис">Опис</h2>

<p>Якщо <code>вираз<strong>1</strong></code> може бути приведений до <code>true</code>, вертає <code>вираз<strong>2</strong></code>; інакше, вертає <code>вираз<strong>1</strong></code>.</p>

<p>Якщо значення може бути приведене до <code>true</code>, воно є так званим {{Glossary("truthy", "правдивим")}} значенням. Якщо значення може бути приведене до <code>false</code>, воно називається {{Glossary("falsy", "хибним")}}.</p>

<p>Прикладами виразів, які можуть бути приведені до false, є:</p>

<ul>
 <li><code>null</code>;</li>
 <li><code>NaN</code>;</li>
 <li><code>0</code>;</li>
 <li>порожній рядок (<code>""</code> або <code>''</code>, або <code>``</code>);</li>
 <li><code>undefined</code>.</li>
</ul>

<p>Хоча оператори <code>&amp;&amp;</code> та <code>||</code> можуть використовуватись з операндами не булевого типу, вони все одно можуть вважатися булевими операторами, оскільки значення, які вони повертають, завжди можуть бути приведені до <a href="/uk/docs/Web/JavaScript/Data_structures#%D0%A2%D0%B8%D0%BF_boolean">булевих примітивів</a>. Щоб явно перетворити повернені значення (або, взагалі, будь-який вираз) до відповідного булевого значення, скористайтесь подвійним <a href="/uk/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Logical_NOT">оператором НЕ</a> або конструктором {{jsxref("Global_Objects/Boolean/Boolean", "Boolean")}}.</p>

<h3 id="Обчислення_з_коротким_замиканням">Обчислення з коротким замиканням</h3>

<p>Логічні вирази І обчислюються зліва направо, вони перевіряються на можливе "коротке замикання" під час обчислення за наступним правилом:</p>

<p><code>(якийсь хибний вираз) &amp;&amp; <em>expr</em></code> обчислюється як хибний вираз;</p>

<p>Коротке замикання означає, що частина <code><em>expr</em></code> у прикладі <strong>не обчислюється</strong>, тому будь-які побічні ефекти від цього не відбудуться (наприклад, якщо <code><em>expr</em></code> є викликом функції, виклику не станеться). Це відбувається тому, що значення оператора вже визначене після обчислення першого операнду. Дивіться приклад:</p>

<pre class="brush: js notranslate">function A(){ console.log('викликано A'); return false; }
function B(){ console.log('викликано B'); return true; }

console.log( A() &amp;&amp; B() );
// виводить "викликано A" в результаті виклику функції,
// потім виводить false (що є результатом виклику оператора)
</pre>

<h3 id="Пріоритет_операторів">Пріоритет операторів</h3>

<p>Наступні вирази можуть виглядати еквівалентними, але це не так, оскільки оператор <code>&amp;&amp;</code> виконується перед оператором <code>||</code> (дивіться <a href="/uk/docs/Web/JavaScript/Reference/Operators/Operator_Precedence">Пріоритет операторів</a>).</p>

<pre class="brush: js notranslate">true || false &amp;&amp; false      // вертає true, оскільки &amp;&amp; виконується першим
(true || false) &amp;&amp; false    // вертає false, бо пріоритет операторів не застосовується</pre>

<h2 id="Приклади">Приклади</h2>

<h3 id="Використання_І">Використання І</h3>

<p>Наступний код наводить приклади оператора <code>&amp;&amp;</code> (логічне І).</p>

<pre class="brush: js notranslate">a1 = true  &amp;&amp; true       // t &amp;&amp; t вертає true
a2 = true  &amp;&amp; false      // t &amp;&amp; f вертає false
a3 = false &amp;&amp; true       // f &amp;&amp; t вертає false
a4 = false &amp;&amp; (3 == 4)   // f &amp;&amp; f вертає false
a5 = 'Кіт' &amp;&amp; 'Пес'      // t &amp;&amp; t вертає "Пес"
a6 = false &amp;&amp; 'Кіт'      // f &amp;&amp; t вертає false
a7 = 'Кіт' &amp;&amp; false      // t &amp;&amp; f вертає false
a8 = ''    &amp;&amp; false      // f &amp;&amp; f вертає ""
a9 = false &amp;&amp; ''         // f &amp;&amp; f вертає false</pre>

<h3 id="Правила_перетворення_для_булевих_значень">Правила перетворення для булевих значень</h3>

<h4 id="Перетворення_І_на_АБО">Перетворення І на АБО</h4>

<p>Наступна операція з <strong>булевими значеннями</strong>:</p>

<pre class="brush: js notranslate">bCondition1 &amp;&amp; bCondition2</pre>

<p>завжди дорівнює:</p>

<pre class="brush: js notranslate">!(!bCondition1 || !bCondition2)</pre>

<h4 id="Перетворення_АБО_на_І">Перетворення АБО на І</h4>

<p>Наступна операція з <strong>булевими значеннями</strong>:</p>

<pre class="brush: js notranslate">bCondition1 || bCondition2</pre>

<p>завжди дорівнює:</p>

<pre class="brush: js notranslate">!(!bCondition1 &amp;&amp; !bCondition2)</pre>

<h3 id="Прибирання_вкладених_дужок">Прибирання вкладених дужок</h3>

<p>Оскільки логічні вирази обчислюються зліва направо, завжди можна прибрати дужки зі складного виразу, дотримуючись певних правил.</p>

<p>Наступна складена операція з <strong>булевими значеннями</strong>:</p>

<pre class="brush: js notranslate">bCondition1 || (bCondition2 &amp;&amp; bCondition3)</pre>

<p>завжди дорівнює:</p>

<pre class="brush: js notranslate">bCondition1 || bCondition2 &amp;&amp; bCondition3</pre>

<h2 id="Специфікації">Специфікації</h2>

<table class="standard-table">
 <thead>
  <tr>
   <th scope="col">Специфікація</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>{{SpecName('ESDraft', '#prod-LogicalANDExpression', 'Logical AND expression')}}</td>
  </tr>
 </tbody>
</table>

<h2 id="Сумісність_з_веб-переглядачами">Сумісність з веб-переглядачами</h2>



<p>{{Compat("javascript.operators.logical_and")}}</p>

<h2 id="Див._також">Див. також</h2>

<ul>
 <li>{{jsxref("Boolean")}}</li>
 <li>{{Glossary("Truthy")}}</li>
 <li>{{Glossary("Falsy")}}</li>
</ul>