Iterator personalizado
Iteradores estão por toda parte no JavaScript moderno: arrays, strings, Map, Set — todos usam o protocolo de iteração. Quando você cria seus próprios objetos que precisam ser percorridos com for...of ou espalhados com o operador ..., implementar Symbol.iterator dá a eles o mesmo tratamento nativo. Isso evita depender de arrays intermediários e mantém a interface consistente com o resto da linguagem.
O PROBLEMA
Crie classe Intervalo com from e to. Implemente [Symbol.iterator] para iterar com for...of.
EXEMPLO
const r = new Intervalo(1, 5); for (const n of r) console.log(n); → 1 2 3 4 5 [...r] → [1,2,3,4,5]
SOBRE O CONCEITO
Para um objeto ser iterável, ele deve ter um método [Symbol.iterator] que retorna um objeto com um método next(). Cada chamada de next() deve devolver { value: ..., done: boolean }. O erro comum é esquecer de retornar esse objeto ou pular a propriedade done, o que faz o loop for...of nunca terminar ou acessar valores indefinidos. Aqui, na classe Intervalo, o método next() precisa controlar o estado interno (usando this.atual, por exemplo) e incrementar até atingir this.to. Quando o limite é ultrapassado, retorna { done: true }. Lembre-se: function e generators são proibidos; você deve usar class com constructor e Symbol.iterator diretamente.
RESOLUÇÃO