Cosa sono e come funzionano gli iteratori in JavaScript

Gli iteratori sono una parte fondamentale di JavaScript, offrendo un modo efficace per attraversare e manipolare sequenze di dati. Questa pagina esplorerà gli iteratori in dettaglio, fornendo una guida completa e ricca di esempi per comprendere appieno il loro funzionamento.

Che cos’è un iteratore?

In JavaScript, un iteratore è un oggetto che consente di iterare su una collezione di dati in modo efficiente e flessibile. In particolare implementa una specifica interfaccia che fornisce un metodo next(). Quest’ultimo restituisce un oggetto con due proprietà: value (il prossimo valore della sequenza) e done (un flag booleano che indica se la sequenza è stata completamente attraversata).

// Definire una sequenza di numeri
const numeri = [1, 2, 3];

// Creare un iteratore
const iteratore = numeri[Symbol.iterator]();

// Ottenere i valori
console.log(iteratore.next()); // { value: 1, done: false }
console.log(iteratore.next()); // { value: 2, done: false }
console.log(iteratore.next()); // { value: 3, done: false }
// ... e così via
console.log(iteratore.next()); // { value: undefined, done: true }

Oggetti iterabili in JavaScript

Un oggetto in JavaScript è considerato iterabile se ha un metodo [Symbol.iterator] che restituisce un oggetto iteratore. Fortunatamente, molte strutture dati native di JavaScript sono iterabili di default, come gli array.

const array = [10, 20, 30];

for (const elemento of array) {
	console.log(elemento);
}

In questo caso, array è un iterabile, e l'operatore of semplifica notevolmente il processo di iterazione.

Iteratori personalizzati

È possibile creare iteratori personalizzati implementando la funzione [Symbol.iterator]() in un oggetto.

const mioIterabile = {
	dati: ['a', 'b', 'c'],
	[Symbol.iterator]() {
		let indice = 0;
		return {
			next: () => {
				if (indice < this.dati.length) {
					return { value: this.dati[indice++], done: false };
				} else {
					return { value: undefined, done: true };
				}
			},
		};
	},
};

for (const elemento of mioIterabile) {
	console.log(elemento);
}

Questo esempio mostra come creare un iterabile personalizzato che può essere utilizzato in un ciclo for...of.