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
|
---
title: switch
slug: Web/JavaScript/Reference/Statements/switch
tags:
- JavaScript
- Інструкція
- Довідка
translation_of: Web/JavaScript/Reference/Statements/switch
---
<div>{{jsSidebar("Statements")}}</div>
<p><span class="seoSummary"><strong>Інструкція</strong> <strong><code>switch</code> </strong>обчислює <a href="/uk/docs/Web/JavaScript/Guide/Вирази_та_оператори">вираз</a>, зіставляє значення виразу зі значенням блоку <code>case</code> та виконує <a href="/uk/docs/Web/JavaScript/Reference/Statements">інструкції</a>, що відносяться до цього блоку, а також інструкції у блоках <code>case</code>, наступних за блоком, що має збіг.</span></p>
<div>{{EmbedInteractiveExample("pages/js/statement-switch.html", "taller")}}</div>
<h2 id="Синтаксис">Синтаксис</h2>
<pre class="syntaxbox">switch (<var>expression</var>) {
case <var>value1</var>:
//Інструкції, що виконуються, коли
//результат виразу збігається з value1
[break;]
case <var>value2</var>:
//Інструкції, що виконуються, коли
//результат виразу збігається з value2
[break;]
...
case <var>valueN</var>:
//Інструкції, що виконуються, коли
//результат виразу збігається з valueN
[break;]
[default:
//Інструкції, що виконуються, коли жодне
//значення не збігається зі значенням виразу
[break;]]
}</pre>
<dl>
<dt><code><var>expression</var></code></dt>
<dd>Вираз, чий результат зіставляється з кожним блоком <code>case</code>.</dd>
<dt><code>case <var>valueN</var></code> {{optional_inline}}</dt>
<dd>Блок <code>case</code>, який зіставляється з виразом <code><var>expression</var></code>. Якщо значення <code><var>expression</var></code> збігається з вказаним значенням <code><var>valueN</var></code>, інструкції всередині блоку <code>case</code> виконуються, поки не досягнуть або кінця інструкції <code>switch</code>, або оператора <code>break</code>.</dd>
<dt><code>default</code> {{optional_inline}}</dt>
<dd>Блок <code>default</code>; якщо вказаний, виконується у випадку, коли значення <code><var>expression</var></code> не збігається з жодним з блоків <code>case</code>.</dd>
</dl>
<h2 id="Опис">Опис</h2>
<p>Інструкція <code>switch</code> спочатку обчислює вираз. Далі шукає перший блок <code>case</code>, чий вираз має таке саме значення, що й результат вхідного виразу (використовуючи <a href="/uk/docs/Web/JavaScript/Reference/Operators/Оператори_порівняння">строгу рівність</a>, <code>===</code>) та передає контроль цьому блоку, виконуючи інструкції, що до нього відносяться. (Якщо більше одного <code>case</code> збігаються з наданим значенням, обирається перший знайдений <code>case</code>, навіть якщо блоки <code>case</code> не дорівнюють одне одному.)</p>
<p>Якщо не знайдено жодного збігу серед блоків <code>case</code>, програма шукає необов'язковий блок <code>default</code>, і, якщо знаходить, передає йому контроль, виконуючи відповідні інструкції. Якщо блоку <code>default</code> не знайдено, програма продовжує виконання першої з інструкції, що йде після завершення <code>switch</code>. Прийнято писати блок <code>default</code> останнім, але це не обов'язково.</p>
<p>Необов'язковий оператор <code><a href="/uk/docs/Web/JavaScript/Reference/Statements/break" title="JavaScript/Reference/Statements/break">break</a></code> у кожному <code>case</code> гарантує, що програма перериває виконання <code>switch</code>, як тільки виконані знайдені інструкції, та продовжує виконання з інструкції, що йде після <code>switch</code>. Якщо <code>break</code> не вказано, програма продовжує виконання наступної інструкції у <code>switch</code>.</p>
<h2 id="Приклади">Приклади</h2>
<h3 id="Використання_switch">Використання <code>switch</code></h3>
<p>У наступному прикладі, якщо <code>expr</code> дорівнює <code>Банани</code>, програма знаходить збіг з блоком <code>case 'Банани'</code> та виконує відповідну інструкцію. Дійшовши до оператора <code>break</code>, програма перериває виконання <code>switch</code> та виконує інструкцію, наступну після <code>switch</code>. Якби не оператор <code>break</code>, інструкція блоку <code>case 'Вишні'</code> також би виконалась.</p>
<pre class="brush: js">switch (expr) {
case 'Апельсини':
console.log('Апельсини коштують $0.59 за фунт.');
break;
case 'Яблука':
console.log('Яблука коштують $0.32 за фунт.');
break;
case 'Банани':
console.log('Банани коштують $0.48 за фунт.');
break;
case 'Вишні':
console.log('Вишні коштують $3.00 за фунт.');
break;
case 'Манго':
case 'Папайя':
console.log('Манго та папайя коштують $2.79 за фунт.');
break;
default:
console.log('Вибачте, в нас закінчились ' + expr + '.');
}
console.log("Бажаєте чого-небудь ще?");
</pre>
<h3 id="Що_станеться_якщо_я_забуду_break">Що станеться, якщо я забуду <code>break</code>?</h3>
<p>Якщо ви забудете <code>break</code>, скрипт буде виконуватись, починаючи від блоку, який відповідає умові, і продовжить виконувати наступні блоки, <strong>незалежно від того, чи відповідають вони умові</strong>.</p>
<p>Дивіться наступний приклад:</p>
<pre class="brush: js">var foo = 0;
switch (foo) {
case -1:
console.log('від\'ємна 1');
break;
case 0: // foo дорівнює 0, отже, умова виконана, і цей блок виконається
console.log(0);
// ЗАУВАГА: забутий break стояв би тут
case 1: // немає оператора break у 'case 0:', тому цей блок також виконається
console.log(1);
break; // програма зустріне тут break і не виконуватиме 'case 2:'
case 2:
console.log(2);
break;
default:
console.log('default');
}</pre>
<h3 id="Чи_можна_поставити_default_між_блоками_case">Чи можна поставити <code>default</code> між блоками <code>case</code>?</h3>
<p>Так, можна! JavaScript відправить вас у <code>default</code>, якщо не знайде збігів:</p>
<pre class="brush: js">var foo = 5;
switch (foo) {
case 2:
console.log(2);
break; // програма зустріне тут break, і не виконуватиме 'default:'
default:
console.log('default')
// проходимо далі
case 1:
console.log('1');
}
</pre>
<p>Це також працює, якщо поставити <code>default</code> перед усіма блоками <code>case</code>.</p>
<h3 id="Методи_для_кількох_критеріїв_case">Методи для кількох критеріїв <code>case</code></h3>
<p>Джерело цієї техніки тут:</p>
<p><a href="http://stackoverflow.com/questions/13207927/switch-statement-multiple-cases-in-javascript">Інструкція switch з кількома блоками case у JavaScript (Stack Overflow)</a></p>
<h4 id="Декілька_case_одна_операція">Декілька <code>case</code> : одна операція</h4>
<p>Цей метод використовує переваги того факту, що, якщо в кінці блоку <code>case</code> немає оператора break, він продовжить виконувати наступний блок <code>case</code>, незалежно від того, чи той відповідає необхідній умові. (Дивіться розділ <a href="#Що_станеться_якщо_я_забуду_break">Що станеться, якщо я забуду <code>break</code>?</a>)</p>
<p>Ось приклад інструкції для єдиної операції з послідовних <code>case</code>, де чотири різні значення виконують одне й те саме.</p>
<pre class="brush: js">var Animal = 'Жирафа';
switch (Animal) {
case 'Корова':
case 'Жирафа':
case 'Собака':
case 'Свиня':
console.log('Ці тварини підуть на Ноїв ковчег.');
break;
case 'Динозавр':
default:
console.log('Ця тварина не піде.');
}</pre>
<h4 id="Декілька_case_ланцюгові_операції">Декілька <code>case</code> : ланцюгові операції</h4>
<p>Ось приклад кількох операцій у послідовних блоках <code>case</code>, де, в залежності від наданого цілого числа, ви можете отримати різний результат. Він демонструє, що виконуватиметься у тому порядку, в якому ви розташували блоки <code>case</code>, і вони не обов'язково мають бути чисельно послідовні. У JavaScript ви навіть можете змішувати їх з рядковими значеннями.</p>
<pre class="brush: js">var foo = 1;
var output = 'Результат: ';
switch (foo) {
case 0:
output += 'То ';
case 1:
output += 'як ';
case 2:
output += 'тебе ';
case 3:
output += 'звати';
case 4:
output += '?';
console.log(output);
break;
case 5:
output += '!';
console.log(output);
break;
default:
console.log('Будь ласка, оберіть число від 0 до 5!');
}</pre>
<p>Результат цього прикладу:</p>
<table class="standard-table">
<thead>
<tr>
<th scope="col">Значення</th>
<th scope="col">Виведений текст</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>foo</code> дорівнює <code>NaN</code> або не <code>1</code>, <code>2</code>, <code>3</code>, <code>4</code>, <code>5</code> чи <code>0</code></td>
<td>Будь ласка, оберіть число від 0 до 5!</td>
</tr>
<tr>
<td><code>0</code></td>
<td>Результат: То як тебе звати?</td>
</tr>
<tr>
<td><code>1</code></td>
<td>Результат: як тебе звати?</td>
</tr>
<tr>
<td><code>2</code></td>
<td>Результат: тебе звати?</td>
</tr>
<tr>
<td><code>3</code></td>
<td>Результат: звати?</td>
</tr>
<tr>
<td><code>4</code></td>
<td>Результат: ?</td>
</tr>
<tr>
<td><code>5</code></td>
<td>Результат: !</td>
</tr>
</tbody>
</table>
<h3 id="Змінні_блочної_області_видимості_у_інструкціях_switch">Змінні блочної області видимості у інструкціях <code>switch</code></h3>
<p>Маючи підтримку ECMAScript 2015 (ES6) у більшості сучасних веб-переглядачів, у певних випадках ви захочете використати оператори {{jsxref("Statements/let", "let")}} та {{jsxref("Statements/const", "const")}} для оголошення змінних блочної області видимості.</p>
<p>Погляньте на цей приклад:</p>
<pre class="brush: js">const action = 'скажи_привіт';
switch (action) {
case 'скажи_привіт':
let message = 'привіт';
console.log(message);
break;
case 'скажи_бувай':
let message = 'бувай';
console.log(message);
break;
default:
console.log('Отримана порожня дія.');
break;
}</pre>
<p>Цей приклад спричинить помилку <code>Uncaught SyntaxError: Identifier 'message' has already been declared</code>, яку ви, можливо, не очікували.</p>
<p>Все тому, що перше оголошення <code>let message = 'привіт';</code> конфліктує з другим оголошенням <code>let message = 'бувай';</code> хоча вони й розташовані у окремих блоках <code>case 'скажи_привіт':</code> та <code>case 'скажи_бувай':</code>. Зрештою, це відбувається тому, що обидва оголошення <code>let</code> інтерпретуються як дублюючі оголошення однієї змінної всередині тієї самої блочної області видимості.</p>
<p>Ми можемо легко це виправити, огорнувши наші блоки <code>case</code> у дужки:</p>
<pre class="brush: js">const action = 'скажи_привіт';
switch (action) {
case 'скажи_привіт': <strong>{ // додані дужки</strong>
let message = 'привіт';
console.log(message);
break;
<strong>} // додані дужки</strong>
case 'скажи_бувай': <strong>{ // додані дужки</strong>
let message = 'бувай';
console.log(message);
break;
<strong>} // додані дужки</strong>
default: <strong>{ // додані дужки</strong>
console.log('Отримана порожня дія.');
break;
<strong>} // додані дужки</strong>
}</pre>
<p>Тепер цей код, як і задумано, виведе у консоль <code>привіт</code> без жодних помилок.</p>
<h2 id="Специфікації">Специфікації</h2>
<table class="standard-table">
<thead>
<tr>
<th scope="col">Специфікація</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{SpecName('ESDraft', '#sec-switch-statement', 'switch statement')}}</td>
</tr>
</tbody>
</table>
<h2 id="Сумісність_з_веб-переглядачами">Сумісність з веб-переглядачами</h2>
<p>{{Compat("javascript.statements.switch")}}</p>
<h2 id="Див._також">Див. також</h2>
<ul>
<li>{{jsxref("Statements/if...else", "if...else")}}</li>
</ul>
|