JavaScript/Iterazione

Wikibooks, manuali e libri di testo liberi.
Jump to navigation Jump to search

L'iterazione è una struttura di controllo (come la selezione) che permette l'esecuzione di una sequenza di una o più istruzioni fino al verificarsi di una data condizione.

Cicli con condizione[modifica]

La forma più semplice di ciclo è composta da una condizione valutata inizialmente e ad un blocco di istruzioni eseguito sino a quando la condizione iniziale non risulti false. In JavaScript usiamo in questo caso un ciclo while la cui sintassi è:

while (condizione)
{
 istruzioni;
}

Quando JavaScript incontra questa struttura:

  1. valuta il valore booleano di condizione. Possiamo avere quindi due casi:
    1. se è vero, esegue il blocco di istruzioni delimitato dalle parentesi graffe e quindi ricomincia dal punto 1
    2. se è falso, salta al punto 2
  2. prosegue la lettura delle istruzioni successive

Si noti che:

  • è possibile che il blocco di istruzioni non venga mai eseguito. Questo è possibile se il valore della condizione iniziale è falso già dalla sua prima valutazione
  • se il blocco di istruzioni non modifica in qualche modo le variabili che intervengono nella condizione iniziale, può accadere che questo venga ripetuto all'infinito

Esiste poi la possibilità di porre la condizione alla fine del blocco di istruzioni; in questo caso si è sicuri che questo verrà eseguito almeno una volta. La sintassi è:

do
{
 istruzioni;
} while (condizione)

Vediamo alcuni esempi; miglioramo ad esempio il piccolo programma che valutava se l'utente era maggiorenne o minorenne:

var anni;
do
{
 anni = prompt("Quanti anni hai?",20);
} while (isNaN(anni))
var msg = "Ciao, vedo che sei " + (anni >= 18 ? "maggiorenne" : "minorenne") + "!";
alert(msg);

In questo modo abbiamo inserito un controllo per verificare che il valore immesso dall'utente sia un numero: la richiesta dell'età viene infatti ripetuta se il valore introdotto non è un numero.

Cicli con contatore[modifica]

JavaScript, come molti altri linguaggi programmazione, offre la funzionalità di cicli con un contatore che viene incrementato o decrementato ad ogni ripetizione. La sintassi è:

for (condizione_iniziale; condizione_finale; incremento_contatore) {
 istruzioni;
}

Ad esempio:

for (var i = 1; i <= 10; i++) {
 alert("i = " + i);
}

Eseguendo il codice appena visto otterremo come output dieci messaggi che indicano il valore di i ad ogni iterazione.

È possibile inoltre fare in modo che il contatore venga incrementato di più di un'unità al secondo:

for (var i = 1; i <= 20; i+=2) {
 alert("i = " + i);
}

Questo codice mostra sempre i primi 10 numeri pari.

Se l'operazione da eseguire è molto semplice, come nel primo esempio che abbiamo visto, è possibile anche usare una sintassi abbreviata:

for (var i = 1; i<= 10; alert("i = " + i++));

L'istruzione di alert contiene infatti un operatore unario "++" applicato alla variabile contatore i; ad ogni ripetizione del ciclo, JavaScript mostra prima il messaggio di alert e poi incrementa la variabile.

Iterare sugli elementi di un array[modifica]

Per iterare in modo automatico gli elementi di un array (funzionalità trattata più avanti nel corso di questo libro), esiste un ciclo particolare, la cui sintassi è:

for (indice in nomeArray) {
 //...
}

L'array assegna man mano ad indice i valori dell'array indicato.

break e continue[modifica]

Le istruzioni break e continue servono per alterare il normale flusso dell'esecuzione di un ciclo:

  • break serve per uscire completamente dal ciclo in cui ci si trova riprendendo dalla prima riga dopo la fine del ciclo. Questo è molto utile se ad esempio si sta effettuando una ricerca tra un insieme di valori: una volta trovato il valore che ci interessa, è inutile andare avanti nel ciclo e quindi si usa break.
  • continue è leggermene diverso da break. Quando viene inserito in un ciclo, interrompe la ripetizione corrente e l'esecuzione continua con il valore successivo del ciclo. Ad esempio si vogliono stampare tutti i numeri da n a m tranne quelli divisibili per 7:
for (var i = n; i <= m; i++) {
   if (i % 7 == 0) continue; // se divisibile per 7 interrompe e ricomincia
   document.write(i);
}