Argomenti trattati: istruzioni switch case con variabili numeriche e alfanumeriche, selezioni multiple.
Come già anticipato nella parte inerente le istruzioni condizionali, l'istruzione switch può essere una valida forma sostitutiva dell'istruzione if in tutti i casi in cui si deve testare il valore assegnato a una variabile, ed è da preferire quando le condizioni da esaminare sono piuttosto numerose. L'istruzione switch si fa preferire per la sua particolare sinteticità e la facilità di lettura rispetto a if. È inoltre piú rapida da eseguire perché a differenza di quanto accade con if, l'interprete non deve esaminare ogni opzione in attesa di trovare, qualora esista, quella corrispondente al caso verificatosi, ma va subito a cercare il valore restituito da un'espressione all'interno dei vari casi di switch. Se il caso verificatosi è previsto, esegue le istruzioni corrispondenti, altrimenti termina la ricerca o, se previste, esegue le istruzioni di default. Per meglio comprendere quanto detto, si osservi il seguente esempio in cui si ricalca, ampliandolo, il terzo esempio fatto nella trattazione di if; in questo caso si ipotizza che una variabile possa "oscillare" fra tre diversi valori:
<html>
<title>Verifica Condizionale tramite l'utilizzo di Switch</title>
<head>
<script language="JavaScript">
<!--
var mia_variabile=1;
switch (mia_variabile) {
case 1:
alert('mia_variabile è uguale a 1');
break;
case 2:
alert('mia_variabile è uguale a 2');
break;
case 3:
alert('mia_variabile è uguale a 3');
break;
}
-->
</script>
</head>
Esaminiamo ora attentamente la sintassi dell'istruzione switch: come si può notare dal listato di esempio, questa istruzione necessita di alcune regole formali particolari. In primo luogo le parentesi graffe vanno apposte esclusivamente dopo la parola chiave switch e alla fine di tutto il codice, senza bisogno di ripeterle dopo ogni caso, come invece avviene per l'istruzione if. In secondo luogo, la parola chiave switch dev'essere seguita da una coppia di parentesi tonde nelle quali va racchiuso il nome della variabile il cui valore andrà ad essere esaminato. Inoltre, dopo l'enumerazione di ogni caso, va aggiunto il simbolo dei due punti (:) e alla fine di ogni serie di istruzioni va messa la parola chiave break seguita dal punto e virgola. Anche case è una parola chiave e, praticamente, scrivere case 1: equivale a scrivere if (mia_variabile==1). Questo per quanto concerne la sintassi; da un punto di vista logico, invece, dovrebbe apparire chiaro come questo costrutto e quello di if siano totalmente intercambiabili ed equivalenti quando si tratta di testare semplicemente il valore assegnato a una variabile, fatte salve la maggiore "sinteticità" e la maggiore efficienza di cui senza dubbio ci si può giovare con l'utilizzo di switch.
Come abbiamo già visto nel capitolo sulle istruzioni condizionali nel costrutto if è possibile avere un else separato per comprendere, nell'esame del valore di una variabile, anche quei casi non presi direttamente in considerazione dal resto delle opzioni. Analogamente anche il costrutto switch permette di fare la stessa cosa, grazie all'utilizzo della parola chiave default. L'esempio che segue mostra tale utilizzo riprendendo l'esempio precedente e ampliandolo con il caso predefenito.
<html>
<title>Verifica Condizionale tramite l'utilizzo di Switch</title>
<head>
<script language="JavaScript">
<!--
var mia_variabile=1;
switch (mia_variabile) {
case 1:
alert('mia_variabile è uguale a 1');
break;
case 2:
alert('mia_variabile è uguale a 2');
break;
case 3:
alert('mia_variabile è uguale a 3');
break;
default:
alert('mia_variabile ha un valore non previsto: ' + mia_variabile);
break;
}
-->
</script>
</head>
Come si può notare, la parola chiave default non richiede l'uso dell'altra parola chiave case; sarebbe anzi un errore sintattico utilizzarle entrambe. Come case, però, anche default dev'essere seguita dal segno dei due punti. Nel caso specifico, l'istruzione alert associata al caso di default, oltre a visualizzare il messaggio, mostra anche il valore non previsto della variabile, concatenando alla stringa delimitata dai singoli apici, il nome della variabile stessa. Dal punto di vista logico l'utilizzo di default: equivale a quello di un else isolato nel costrutto if.
Logicamente, nei due esempi fatti finora, non vi è un'effettiva necessità dell'utilizzo di switch, dal momento che il valore di mia_variabile è definito all'interno dello stesso script e dunque è già conoscibile senza bisogno di esaminarlo. Nell'esempio interattivo che segue, è l'utente stesso che può modificare a piacimento il valore della variabile, testando cosí il comportamento dello script.
Finora abbiamo visto l'utilizzo di switch esclusivamente con valori numerici; non diversamente da quanto accade con if, anche switch può essere usato con valori di tipo alfanumerico o stringa. Si veda l'esempio, analogo al precedente, con stringhe al posto dei numeri:
<html>
<title>Verifica Condizionale tramite l'utilizzo di Switch</title>
<head>
<script language="JavaScript">
<!--
var mia_variabile='a';
switch (mia_variabile) {
case 'a':
alert('mia_variabile è uguale ad "a"');
break;
case 'b':
alert('mia_variabile è uguale a "b"');
break;
case 'c':
alert('mia_variabile è uguale a "c"');
break;
default:
alert('mia_variabile ha un valore non previsto: ' + mia_variabile);
break;
}
-->
</script>
</head>
In quest'esempio si può notare come i caratteri alfanumerici di tipo stringa siano sempre delimitati con due apici singoli, - ma possono essere anche doppi - anche quando seguono la parola chiave case. Ometterli sarebbe un errore. Naturalmente JavaScript permette anche di utilizzare stringhe piú lunghe di un carattere all'interno dell'istruzione switch.
È possibile provare anche quest'esempio cliccando sul pulsante "Verifica la condizione". Il pulsantino di incremento scorrerà le lettere dell'alfabeto dalla "a" alla "z".
Non diversamente da ogni altra istruzione di controllo JavaScript anche switch può essere annidata, ovvero vi possono essere una o piú switch contenute in una prima switch. Il listato che segue mostra un caso di annidamento di switch su due livelli:
<html>
<title>Annidamento di switch su due livelli</title>
<head>
<script language="JavaScript">
<!--
var primo_Livello=1; var secondo_Livello=1;
switch (primo_Livello) {
case 1:
alert('primo_Livello vale 1');
switch(secondo_Livello) {
case 1:
alert('secondo_Livello vale 1');
break;
case 2:
alert('secondo_Livello vale 2');
break;
default:
alert('secondo_Livello ha un valore non previsto: ' + secondo_Livello);
break;
}
break;
case 2:
alert('primo_Livello vale 2');
switch(secondo_Livello) {
case 1:
alert('secondo_Livello vale 1');
break;
case 2:
alert('secondo_Livello vale 2');
break;
default:
alert('secondo_Livello vale ha un valore non previsto: ' + secondo_Livello);
break;
}
break;
}
-->
</script>
</head>
Il fatto che nell'esempio vi siano tre e non due istruzioni switch potrebbe destare qualche perplessità, dal momento che si è detto che l'annidamento sarebbe stato su due livelli. Il numero dei livelli di annidamento, però, non si riferisce al numero delle istruzioni switch che possono essere presenti nel codice ma solo a quante di esse sono effettivamente annidate, cioè contenute, a una "profondità" sempre maggiore all'interno di una prima switch. Nel caso dell'esempio la switch piú esterna contiene sí al suo interno altre due istruzioni dello stesso tipo ma tra di esse non intercorre un ulteriore rapporto di annidamento. Sono ambedue contenute all'interno della prima switch su un livello che potremmo definire parallelo. Se invece la seconda o la terza switch o entrambe avessero contenuto al loro interno un'altra istruzione del medesimo tipo allora i livelli di annidamento sarebbero stati tre e cosí via. È inoltre opportuno notare che nell'esempio, nella seconda switch, si fa riferimento sempre alla variabile secondo_Livello. Questo sarebbe del tutto inutile in un vero script; se infatti vi fosse la necessità di eseguire le stesse operazioni in due o piú casi, anziché ripetere le stesse istruzioni, si dovrebbe ricorrere a una selezione multipla, come avremo modo di vedere nel prossimo paragrafo. Nel caso dell'esempio di cui sopra si voleva solo sottolineare come anche la seconda switch annidata si trovasse comunque allo stesso livello di annidamento di quella precedente.
Anche in questo caso un esempio interattivo servirà probabilmente a dissipare eventuali dubbi o incertezze. Cliccando sui due pulsantini di incremento qui sotto sarà possibile cambiare il valore di entrambe le variabili che identificano i due diversi livelli di annidamento, mostrando quindi in che modo avviene la selezione all'interno delle diverse istruzioni switch. Per comodità, la possibilità di cambiare la variabile primo_Livello è stata limitata a due soli valori; questo allo scopo di non rendere troppo "prolisso" il codice.
Per selezioni multiple si intende la possibilità, offerta dall'istruzione switch, di esaminare il valore di una variabile raffrontandolo con piú di un'opzione. Questo risulta di grande importanza qualora si abbia bisogno di eseguire le stesse istruzioni in piú di un caso. Anziché ripeterle, come accennato prima, è possibile assegnarle una sola volta ai diversi casi in questione. Per far questo è sufficiente incolonnare piú case uno sopra l'altro. Il listato qui sotto è un esempio di quanto detto.
<html>
<title>Selezione multipla con switch</title>
<head>
<script language="JavaScript">
<!--
var mia_variabile=1;
switch (mia_variabile) {
case 1:
case 2:
case 3:
alert('mia_variabile è uguale a 1, 2 o 3');
break;
case 4:
case 5:
case 6:
alert('mia_variabile è uguale a 4, 5 o 6');
break;
case 10:
case 20:
case 30:
alert('mia_variabile è uguale a 10, 20 o 30');
break;
default:
alert('mia_variabile ha un valore non previsto: ' + mia_variabile);
break;
}
-->
</script>
</head>
L'ultimo esempio interattivo di questa pagina dà una dimostrazione pratica del listato qui sopra.
Abbiamo visto come usare i costrutti if e switch per operare scelte condizionali; proseguiremo ora con la trattazione di altri importantissimi costrutti sintattici, comuni a tutti i linguaggi di programmazione: i cicli.