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
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
|
---
title: switch
slug: Web/JavaScript/Reference/Statements/switch
tags:
- JavaScript
- Reference
- Statement
- Web
translation_of: Web/JavaScript/Reference/Statements/switch
---
<div>{{jsSidebar("Statements")}}</div>
<p><span class="seoSummary"><code>Il<strong> comando</strong></code><strong><code>switch</code></strong> valuta un <a href="/it-IT/docs/Web/JavaScript/Guide/Expressions_and_Operators">espressione</a>, confronta il valore dell'espressione con ciascuna delle clausole <code>case</code> ed esegue i <a href="/it-IT/docs/Web/JavaScript/Reference/Statements">comandi</a> (<a href="/en-US/docs/Web/JavaScript/Reference/Statements">statements</a>) associati alla clausola (<code>case</code>) che verifica il confronto.</span></p>
<h2 id="Sintassi">Sintassi</h2>
<pre class="syntaxbox">switch (espressione) {
case valore1:
//Comandi eseguiti quando il valore dell'espressione coincide con valore1
[break;]
case valore2:
//Comandi eseguiti quando il valore dell'espressione coincide con valore2
[break;]
...
case valoreN:
//Comandi eseguiti quando il valore dell'espressione coincide con valoreN
[break;]
default:
//Comandi eseguiti quando nessuno dei valori coincide col valore dell'epressione
[break;]
}</pre>
<dl>
<dt><code>espressione</code></dt>
<dd>Un'espressione il cui risultato è confrontato con ogni clausola case.</dd>
<dt><code>case valoreN</code></dt>
<dd>Clausola case usata nel confronto con l' <code>espressione</code>.</dd>
<dt><code>default</code></dt>
<dd>Una clausola <code>default</code> è facoltativa e, se specificata, la clausola viene eseguita se il valore dell'<code>espressione</code> non corrisponde a nessuna clausola <code>case</code>.</dd>
</dl>
<h2 id="Descrizione">Descrizione</h2>
<p>Un comando switch per prima cosa valuta <code>espressione</code>; poi cerca la prima clausola <code>case</code> la cui essa ha lo stesso valore del risultato dell'espressione di <code>switch</code> (utilizzando la <a href="/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators">strict comparison</a>, <code>===</code>); quindi il comando <code>switch</code> trasferisce il controllo alla clausola <code>case</code>, eseguendone i comandi. Se più clausole <code>case</code> sono verificate dal confronto con l'espressione di <code>switch</code>, viene scelta la prima che verifica il confronto, anche se le clausole non sono uguali. Se nessuna clausola <code>case</code> risulta verificata dal confronto, il programma cerca la clausola facoltativa <code>default</code>, e se la trova, trasferisce il controllo a questa, eseguendone i comandi. Se non viene trovata alcuna clausola <code>default</code>, il programma continua eseguendo il comando successivo alla fine del comando <code>switch</code>. Convenzionalmente, ma non necessariamente, la clausola <code>default</code> è l'ultima clausola.</p>
<p>Il comando facoltativo <code><a href="/en-US/docs/Web/JavaScript/Reference/Statements/break" title="JavaScript/Reference/Statements/break">break</a></code> associato a ciascuna etichetta <code>case</code> assicura che, una volta eseguiti i comandi della clausola che verifica l'espressione di <code>switch</code>, il programma interrompa il comando switch e che continui eseguendo il comando successivo. Se il comando <code>break</code> viene omesso, il programma continua l'esecuzione dal comando successivo all'interno del comando di <code>switch</code>, quindi dal primo della successiva clausola <code>case</code>.</p>
<h2 id="Esempi">Esempi</h2>
<h3 id="Utilizzo_di_switch">Utilizzo di <code>switch</code></h3>
<p>Nell'esempio seguente, se <code>expr</code> vale "Banane", il programma confronta il valore con la clausola "Banane" ed esegue i comandi associati. Quando incontra <code>break</code>, il programma interrompe il comando <code>switch</code> ed esegue il comando successivo a <code>switch</code>. Se <code>break</code> fosse omesso, sarebbero eseguiti anche i comandi della clausola "Ciliegie".</p>
<pre class="brush: js">switch (expr) {
case "Arance":
console.log("Le arance costano €1,0 al chilo.");
break;
case "Mele":
console.log("Le mele costano €0.64 al chilo.");
break;
case "Banane":
console.log("Le banane costano €0.92 al chilo.");
break;
case "Ciliege":
console.log("Le ciliegie costano €2.59 al chilo.");
break;
case "Manghi":
case "Papaye":
console.log("I manghi e le papaye costano €1.79 al chilo.");
break;
default:
console.log("Spiacenti, non abbiamo " + expr + ".");
}
console.log("Desidera qualcos'altro ?");
</pre>
<h3 id="Cosa_accade_se_dimentico_un_break">Cosa accade se dimentico un <font face="consolas, Liberation Mono, courier, monospace"><span style="background-color: rgba(255, 255, 255, 0.4);">break</span></font>?</h3>
<p>Se vi dimenticate un break, lo script partirà dalla clausola il cui criterio è verificato, e proseguirà con la clausola successiva anche se il criterio non era verifcato. Ecco alcuni esempi:</p>
<pre class="brush: js">var foo = 0;
switch (foo) {
case -1:
console.log('1 negativo');
break;
case 0: // foo è 0 quindi il criterio è verificato; questo blocco verrà eseguito
console.log(0);
// NOTA: il break dimenticato sarebbe dovuto essere qui
case 1: // manca il comando break in 'case 0:' quindi anche questo blocco sarà eseguito
console.log(1);
break; // incontra questo break così con proseguirà in 'case 2:'
case 2:
console.log(2);
break;
default:
console.log('default');
}</pre>
<h3 id="Posso_mettere_un_default_in_mezzo">Posso mettere un <font face="consolas, Liberation Mono, courier, monospace"><span style="background-color: rgba(255, 255, 255, 0.4);">default</span></font> in mezzo?</h3>
<p>Certo che puoi! JavaScript passerà al default se non troverà nessun criterio corrispondente:</p>
<pre><code>var foo = 5;
switch (foo) {
case 2:
console.log(2);
break; // incontra un break, quindi non procederà automaticamente su "default:"
default:
console.log('default')
// non c'è un break, quindi verrà eseguito anche il contenuto di "case 1:"!
case 1:
console.log('1');
}</code></pre>
<p>Funziona anche se metti default prima di ogni altra clausola.</p>
<h3 id="Riscrivere_molteplici_istruzioni_If_con_Switch">Riscrivere molteplici istruzioni If con Switch</h3>
<p>Di seguito viene fornito un esempio:</p>
<pre><code>var a = 100;
var b = NaN;
switch (true) {
case isNaN(a) || isNaN(b):
console.log('NaNNaN');
break;
case a === b:
console.log(0);
break;
case a < b:
console.log(-1);
break;
default:
console.log(1);
}</code></pre>
<h3 id="Metodi_per_i_case_con_più_criteri">Metodi per i <code>case</code> con più criteri</h3>
<p>I sorgenti per questa tecnica possono essere scaricati qui:</p>
<p><a href="http://stackoverflow.com/questions/13207927/switch-statement-multiple-cases-in-javascript">Switch statement multiple cases in JavaScript (Stack Overflow)</a></p>
<h4 id="Multi-case_-_operazione_singola">Multi-case - operazione singola</h4>
<p>Questo metodo si avvale del fatto che se non c'è un <code>break</code> break prima di un comando di <code>case</code> continuerà eseguento il successivo comando di <code>case</code> ingnorando se verifica il criterio di esecuzione. Vedi la sezione "Cosa accade se dimentico un <code>break</code>?"</p>
<p>Questo è un esempio di un comando di switch a singola operazione sequenziale, dove quattro valori diversi realizzano la stessa cosa.</p>
<pre class="brush: js">var Animale = 'Giraffa';
switch (Animale) {
case 'Mucca':
case 'Giraffa':
case 'Cane':
case 'Maiale':
console.log('Queso animale anndrà sull'Arca di Noè.');
break;
case 'Dinosauro':
default:
console.log('Questo animale non andrà.');
}</pre>
<h4 id="Multi-case_-_operazioni_concatenate">Multi-case - operazioni concatenate</h4>
<p>Questo è un esempio di un comando di switch ad operazione multipla sequenziale, dove, a seconda del numero intero fornito, si ricevono diversi output. Mostra come sia possibile sfruttare l'ordine in cui sono scritte le clausole, e come non debbano essere numericamente in sequenza. In JavaScript, si possono anche inserire definizioni di stringhe nei comandi case.</p>
<pre class="brush: js">var foo = 1;
var output = 'Output: ';
switch (foo) {
case 10:
output += 'quindi ';
case 1:
output += 'quale ';
output += 'è ';
case 2:
output += ' il tuo ';
case 3:
output += 'nome';
case 4:
output += '?';
console.log(output);
break;
case 5:
output += '!';
console.log(output);
break;
default:
console.log('Per favore prendere un numero da 1 a 5 o 10!');
}</pre>
<p>Output per questo esempio:</p>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Valore</th>
<th scope="col">Testo di log</th>
</tr>
<tr>
<td>foo è diverso da 1, 2, 3, 4, 5 or 10</td>
<td>Per favore prendere un numero da 1 a 5 o 10!</td>
</tr>
<tr>
<td>10</td>
<td>Output: quindi quale è il tuo nome?</td>
</tr>
<tr>
<td>1</td>
<td>Output: quale è il tuo nome?</td>
</tr>
<tr>
<td>2</td>
<td>Output: il tuo nome?</td>
</tr>
<tr>
<td>3</td>
<td>Output: nome?</td>
</tr>
<tr>
<td>4</td>
<td>Output: ?</td>
</tr>
<tr>
<td>5</td>
<td>Output: !</td>
</tr>
</tbody>
</table>
<h2 id="Specifiche">Specifiche</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Specifiche</th>
<th scope="col">Status</th>
<th scope="col">Commento</th>
</tr>
<tr>
<td>{{SpecName('ES3')}}</td>
<td>{{Spec2('ES3')}}</td>
<td>Definizione iniziale. Relaizzata in JavaScript 1.2</td>
</tr>
<tr>
<td>{{SpecName('ES5.1', '#sec-12.11', 'switch statement')}}</td>
<td>{{Spec2('ES5.1')}}</td>
<td></td>
</tr>
<tr>
<td>{{SpecName('ES6', '#sec-switch-statement', 'switch statement')}}</td>
<td>{{Spec2('ES6')}}</td>
<td></td>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-switch-statement', 'switch statement')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="Compatibilità_dei_browser">Compatibilità dei browser</h2>
<p>{{CompatibilityTable}}</p>
<div id="compat-desktop">
<table class="compat-table">
<tbody>
<tr>
<th>Feature</th>
<th>Chrome</th>
<th>Firefox (Gecko)</th>
<th>Internet Explorer</th>
<th>Opera</th>
<th>Safari</th>
</tr>
<tr>
<td>Basic support</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>Feature</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>Basic support</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="Vedi_anche">Vedi anche</h2>
<ul>
<li><a href="/it-IT/docs/Web/JavaScript/Reference/Statements/if...else"><code>if...else</code></a></li>
</ul>
|