Referência completa com definições, exemplos de código e termos relacionados para dominar conceitos avançados de JavaScript.
Função especial em JavaScript marcada com asterisco (*) que pode pausar e retomar sua execução usando yield. Permite processamento sob demanda e controle fino sobre iteração.
function* myGenerator() { yield 1; yield 2; }
Palavra-chave que pausa a execução de uma generator function e retorna um valor. A execução pode ser retomada chamando .next() no iterator.
yield value; // pausa e retorna 'value'
Objeto que implementa o protocolo de iteração com método .next() que retorna {value, done}. Permite percorrer sequências de dados.
const iterator = myGenerator(); iterator.next();
Symbol bem conhecido que define o método iterator padrão para um objeto. Permite que objetos sejam iteráveis com for...of.
obj[Symbol.iterator] = function* () { yield 1; }
Generator function que trabalha com operações assíncronas usando async function* e pode yield Promises. Consumido com for await...of.
async function* asyncGen() { yield await fetch('/api'); }
Loop que itera sobre objetos async iterable, aguardando cada Promise antes de continuar. Usado com async generators.
for await (const item of asyncGenerator()) { }
Métodos como map(), filter(), take() que funcionam com iterators para criar pipelines de transformação sob demanda.
iterator.map(x => x * 2).filter(x => x > 5).take(10)
Sequência de operações de transformação de dados onde saída de uma etapa é entrada da próxima. Comum com iterator helpers.
data.map(transform).filter(validate).take(limit)
Estratégia onde valores são computados apenas quando necessários, não antecipadamente. Economiza memória e CPU em generators.
// Só processa quando .next() é chamado
Técnica para controlar velocidade de operações, especialmente útil com APIs. Evita ban por excesso de requisições.
await new Promise(r => setTimeout(r, 1000/rateLimit))
Processamento de dados em lotes (chunks) ao invés de item por item ou tudo de uma vez. Equilibra performance e memória.
for (const batch of chunk(data, 1000)) { }
Problema onde memória é alocada mas nunca liberada, causando crescimento contínuo do uso de RAM até crash da aplicação.
// Arrays gigantes que não são limpos
Mecanismo para controlar fluxo de dados quando produtor é mais rápido que consumidor. Evita overflow de memória em streams.
// Stream pausa quando buffer está cheio
Processamento de dados conforme chegam, sem carregar tudo na memória. Ideal para arquivos grandes e dados real-time.
// Processa linha por linha conforme lê arquivo