Label JavaScript

Edoardo Midali
Edoardo Midali

Le label in JavaScript sono identificatori che permettono di marcare blocchi di codice o cicli per poterli referenziare con le istruzioni break e continue. Anche se raramente utilizzate nella programmazione moderna, le label possono essere utili in situazioni specifiche con cicli annidati complessi.

Cosa Sono le Label

Una label è semplicemente un identificatore seguito dai due punti (:) che precede un’istruzione o un blocco di codice. Le label non sono variabili e non occupano spazio in memoria: sono solo marcatori che il motore JavaScript utilizza per identificare specifiche sezioni di codice.

etichetta: {
  console.log("Codice nel blocco etichettato");
  // Altri comandi...
}

cicloEsterno: for (let i = 0; i < 3; i++) {
  console.log("Ciclo esterno:", i);
}

Le label seguono le stesse regole di nomenclatura delle variabili: possono contenere lettere, numeri, underscore e il simbolo dollaro, ma non possono iniziare con un numero.

Utilizzo con break

Il caso d’uso più comune delle label è con l’istruzione break per uscire da cicli annidati specifici:

esterno: for (let i = 0; i < 3; i++) {
  interno: for (let j = 0; j < 3; j++) {
    if (i === 1 && j === 1) {
      break esterno; // Esce dal ciclo esterno, non solo da quello interno
    }
    console.log(`i: ${i}, j: ${j}`);
  }
}

console.log("Fine cicli");
// Output:
// i: 0, j: 0
// i: 0, j: 1
// i: 0, j: 2
// i: 1, j: 0
// Fine cicli

Senza la label, break uscirebbe solo dal ciclo interno, mentre con break esterno esce completamente dal ciclo esterno, terminando entrambi i cicli.

Utilizzo con continue

Le label funzionano anche con continue per saltare all’iterazione successiva di un ciclo specifico:

esterno: for (let i = 0; i < 3; i++) {
  console.log(`Inizio iterazione esterna ${i}`);

  for (let j = 0; j < 3; j++) {
    if (j === 1) {
      continue esterno; // Salta al prossimo i, non al prossimo j
    }
    console.log(`  Interno: i=${i}, j=${j}`);
  }

  console.log(`Fine iterazione esterna ${i}`);
}

// Output:
// Inizio iterazione esterna 0
//   Interno: i=0, j=0
// Inizio iterazione esterna 1
//   Interno: i=1, j=0
// Inizio iterazione esterna 2
//   Interno: i=2, j=0

Con continue esterno, quando j è uguale a 1, l’esecuzione salta direttamente alla prossima iterazione del ciclo esterno, saltando il resto del ciclo interno e anche il log “Fine iterazione esterna”.

Label con Blocchi di Codice

Le label possono essere utilizzate anche con blocchi di codice normali (non solo cicli):

bloccoComplesso: {
  console.log("Inizio blocco");

  let condizione = Math.random() > 0.5;

  if (condizione) {
    console.log("Condizione vera, esco dal blocco");
    break bloccoComplesso;
  }

  console.log("Continuo nel blocco");
  console.log("Altre operazioni...");
}

console.log("Dopo il blocco");

Questo può essere utile per uscire da sezioni complesse di codice senza dover usare variabili di controllo o funzioni separate.

Esempi Pratici

Ricerca in Matrice

Un caso classico è la ricerca di un elemento in una matrice bidimensionale:

function trovaNellaMatrice(matrice, valore) {
  let trovato = false;
  let riga = -1;
  let colonna = -1;

  ricerca: for (let i = 0; i < matrice.length; i++) {
    for (let j = 0; j < matrice[i].length; j++) {
      if (matrice[i][j] === valore) {
        riga = i;
        colonna = j;
        trovato = true;
        break ricerca; // Esce da entrambi i cicli
      }
    }
  }

  return trovato ? { riga, colonna } : null;
}

const matrice = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
];

console.log(trovaNellaMatrice(matrice, 5)); // { riga: 1, colonna: 1 }

Validazione Complessa

function validaDati(dati) {
  validazione: {
    // Controllo presenza campi obbligatori
    if (!dati.nome || !dati.email) {
      console.log("Campi obbligatori mancanti");
      break validazione;
    }

    // Controllo formato email
    if (!dati.email.includes("@")) {
      console.log("Email non valida");
      break validazione;
    }

    // Controllo lunghezza nome
    if (dati.nome.length < 2) {
      console.log("Nome troppo corto");
      break validazione;
    }

    console.log("Dati validi");
    return true;
  }

  console.log("Validazione fallita");
  return false;
}

Alternative Moderne

Nella programmazione JavaScript moderna, le label sono spesso evitate in favore di approcci più leggibili:

Uso di Funzioni

// Invece di label complesse
function processaMatrice(matrice) {
  esterno: for (let i = 0; i < matrice.length; i++) {
    for (let j = 0; j < matrice[i].length; j++) {
      if (condizioneComplessa(matrice[i][j])) {
        break esterno;
      }
      // Processamento...
    }
  }
}

// Approccio moderno con funzioni
function processaMatriceModerno(matrice) {
  return matrice.some((riga, i) => {
    return riga.some((elemento, j) => {
      if (condizioneComplessa(elemento)) {
        return true; // Equivale a break esterno
      }
      // Processamento...
      return false;
    });
  });
}

Uso di Metodi di Array

// Con label
function trovaPrimo(numeri) {
  ricerca: for (let numero of numeri) {
    if (numero < 2) continue ricerca;

    for (let i = 2; i < numero; i++) {
      if (numero % i === 0) {
        continue ricerca;
      }
    }

    return numero;
  }
  return null;
}

// Approccio moderno
function trovaPrimoModerno(numeri) {
  return (
    numeri.find((numero) => {
      if (numero < 2) return false;

      for (let i = 2; i < Math.sqrt(numero); i++) {
        if (numero % i === 0) return false;
      }

      return true;
    }) || null
  );
}

Considerazioni e Best Practices

Leggibilità: Le label possono rendere il codice meno leggibile, specialmente per sviluppatori non familiari con questa sintassi.

Manutenibilità: Codice con molte label può essere difficile da modificare e debuggare.

Alternative: Considera l’uso di funzioni, metodi di array o ristrutturazione del codice prima di ricorrere alle label.

Naming: Se usi le label, scegli nomi descrittivi che spieghino il loro scopo (ricercaInMatrice invece di loop1).

Scope limitato: Le label hanno senso principalmente per cicli annidati complessi dove le alternative moderne non sono applicabili.

Le label sono uno strumento specifico che può essere utile in situazioni particolari, ma nella maggior parte dei casi esistono alternative più moderne e leggibili che dovrebbero essere preferite.