# JavaScript/Selezione

JavaScript
Copertina Tutti i moduli · Sviluppo
* IntroduzioneJavaScript/Introduzione
* Il nostro primo programmaJavaScript/Il nostro primo programma
* Tipi di dati e variabiliJavaScript/Tipi di dati e variabili
* Operatori e castingJavaScript/Operatori e casting
* Le strutture di controllo
** SelezioneJavaScript/Selezione
** IterazioneJavaScript/Iterazione
* Funzioni definite dall'utenteJavaScript/Funzioni definite dall'utente
* Programmazione ad oggettiJavaScript/Oggetti
** Oggetto StringJavaScript/Oggetto String
** Oggetto MathJavaScript/Oggetto Math
** Oggetto DateJavaScript/Oggetto Date
** Oggetto ArrayJavaScript/Oggetto Array
* CookieJavaScript/Cookie
* TimerJavaScript/Timer
* L'oggetto windowJavaScript/BOM
** Gli eventi nel BOMJavaScript/Gli eventi nel BOM
** Oggetto documentJavaScript/Oggetto document
** Altri oggetti del BOMJavaScript/Altri oggetti del BOM
* Il Document Object ModelJavaScript/DOM
** Proprietà e metodiJavaScript/Proprietà e metodi del DOM
** Gli eventi nel DOMJavaScript/Gli eventi nel DOM
* Espressioni regolariJavaScript/Espressioni regolari
* AJAX
** Introduzione ad AJAXJavaScript/Introduzione ad AJAX
** Usare AJAXJavaScript/Usare AJAX
* Costruttori e prototipiJavaScript/Costruttori e prototipi
* AppendiceJavaScript/Appendice
* CreditiJavaScript/Crediti
Modifica il sommario
La selezione (o controllo) è, insieme alla sequenza (già vista nei moduli precedenti) e al ciclo (che vedremo nel prossimo), una delle tre strutture fondamentali della programmazione e al suo livello più semplice consiste in una scelta tra due blocchi di istruzioni da seguire in base ad una condizione valutata inizialmente, che può essere vera o falsa.

## Selezione semplice

È la forma più semplice di selezione. Vediamo la sua sintassi:
Quando il parser raggiunge questo listato, valuta il valore dell'espressione booleana condizione. Nel caso condizione restituisca true verranno eseguite le istruzioni comprese tra la prima coppia di parentesi graffe (nell'esempio istruzioni1) altrimenti vengono eseguite le istruzioni comprese tra la seconda coppia di parentesi (istruzioni2). Vediamo un esempio:
Il metodo già visto prompt chiede all'utente di inserire la data della scoperta delle Americhe. Nella riga successiva compare la nostra selezione: se a (ossia il valore inserito dall'utente) è uguale a 1492 allora viene mostrato un messaggio di complimenti; in caso contrario, viene mostrato un altro messaggio che informa l'utente dell'errore commesso. Si noti l'uso dell'operatore booleano == (uguale) che può restituire true o false. Notare anche la differenza tra l'operatore di assegnazione(=) e quello di uguaglianza(==), che se confusi erroneamente restituiscono risultati diversi da quelli previsti.
È possibile, nel caso non sia necessario, omettere il blocco else; se inoltre il primo blocco di istruzioni è costituito da una sola riga e non c'è il blocco else, è possibile tralasciare le parentesi graffe. Esempio:
è una soluzione valida.

## Blocchi if annidati e condizioni multiple

All'interno di un blocco if è ovviamente possibile inserire a loro volta altri blocchi di selezione, che sono chiamati annidati (uno dentro l'altro). Si faccia però attenzione al seguente esempio:
Questo codice è inutilmente lungo, in quanto è possibile riassumerlo con un unico blocco usando gli operatori logici già visti in precedenza:

## else if

Esiste una forma particolare di else che permette di eseguire all'interno del suo blocco un'altra selezione. Vediamo questo codice:
Se all'interno del blocco else c'è una sola selezione è possibile usare questa sintassi più abbreviata
In questo caso il parser controllerà cond1; se essa è vera vengono eseguite le istruzioni1, se invece è falsa e cond2 è vera, verranno eseguite le istruzioni2; se entrambe le condizioni sono false verranno eseguite le istruzioni3.

## switch

L'istruzione switch è un tipo particolare di selezione che permette di verificare i possibili valori dell'espressione presa in considerazione. La sintassi è:
Quando il browser incontra questa istruzione, scorre tutti i valori val1, val2, ...val_n fino a che non incontra un valore uguale all'espressione indicata tra parentesi oppure un blocco default. In questo caso inizia ad eseguire il codice che segue i due punti. Se non c'è alcun blocco default e non ci sono valori che soddisfino l'uguaglianza, il parser prosegue eseguendo le istruzioni dopo la chiusura delle parentesi graffe. Si faccia però attenzione a questo spezzone:
Si potrebbe supporre che l'output di questo codice sia solo una alertbox contenente il messaggio a = 1 in quanto il blocco 2 soddisfa l'uguaglianza (a + 1 = 2). Non è tuttavia così: il parser dopo essersi fermato al blocco 2 proseguirà leggendo anche i blocchi successivi e il blocco default. Per evitare ciò dobbiamo inserire un'istruzione break. L'istruzione break indica al parser di interrompere la lettura della struttura switch e di proseguire oltre le parentesi graffe. L'esempio corretto è:
Ovviamente il break non è necessario per l'ultimo blocco.
Vediamo poi un altro listato:
Bisogna fare attenzione a non porre il blocco default in cima, in quanto il parser si fermerebbe subito lì e, incontrata l'istruzione break, salterebbe alla fine del blocco switch senza valutare le altre espressioni.
Notare che la selezione switch è sostituibile con una selezione di if ed else if.

## Operatore ternario

Esiste oltre agli operatori già menzionati nel capitolo precedente anche un cosiddetto operatore ternario, che lavora con tre valori. La sua sintassi è:
Quando il parser incontra questa notazione, valuta il valore booleano di condizione. Se è vero, restituisce il valore di esp1 altrimenti quello di esp2. Questo permette di creare semplici selezioni; ad esempio:
In questo caso l'operatore ternario restituisce "maggiorenne" se anni è maggiore o uguale a 18, altrimenti restituisce "minorenne".

## Esercizi

* Scrivere un programma che converta un voto numerico chiesto all'utente (da 0 a 10) in un giudizio (insufficiente, sufficiente, buono, ecc...).
* È possibile risolvere il programma precedente usando solo con istruzioni if?
Sì, prevedendo una serie di if, meglio se utilizzando una struttura else if: