Movatterモバイル変換


[0]ホーム

URL:


  1. Tecnologia Web para desenvolvedores
  2. JavaScript
  3. Guia JavaScript
  4. Iteratores e geradores

Esta página foi traduzida do inglês pela comunidade.Saiba mais e junte-se à comunidade MDN Web Docs.

View in EnglishAlways switch to English

Iteratores e geradores

Processar cada item em uma coleção é uma operação muito comum. O JavaScript disponibiliza uma série de maneiras de iterar sobre uma coleção, desde um simples laçofor, até ummap() e também com ofilter(). Iteradores e Geradores trazem o conceito da interação ocorrer diretamente no núcleo da linguagem e prover um mecanismo para a customização do comportamento dos laçosfor...of.

Para detalhes, também veja:

Iterators (Iteradores)

Um objeto é umiterator (iterador) quando sabe como acessar itens numa coleção, um por vez, enquanto mantém rastreada a posição atual em uma dada sequência. Em JavaScript um iterator é um objeto que oferece o métodonext(), o qual retorna o próximo item da sequência. Este método retorna um objeto com duas propriedades:done evalue.

Uma vez criado, um objeto iterator pode ser usado explicitamente ao chamar repetidas vezes o métodonext().

js
const makeIterator = (array) => {  let nextIndex = 0;  return {    next: () => {      return nextIndex < array.length        ? { value: array[nextIndex++], done: false }        : { done: true };    },  };};

Uma vez inicializado, o métodonext() pode ser chamado para acessar os pares chave/valor do objeto da vez.

js
let it = makeIterator(["yo", "ya"]);console.log(it.next().value); // 'yo'console.log(it.next().value); // 'ya'console.log(it.next().done); // true

Iterables (Iteráveis)

Um objeto é iterável(iterable), se ele define seu comportamento de iteração, como no caso de quais valores percorridos em um laço do tipofor..of. Alguns tipos embutidos, como oArray, ou oMap, têm um comportamento iterável padrão, enquanto outros tipos (como oObject) não possuem.

Para que um objeto sejaiterable, o objeto precisa implementar o método@@iterator, significando que o objeto (ou um dos objetos na cadeia de prototipagem -prototype chain) precisa ter uma propriedade com uma chaveSymbol.iterator:

Iterables definidos pelo usuário

Você pode fazer seus próprios iteráveis da seguinte maneira:

js
var myIterable = {};myIterable[Symbol.iterator] = function* () {  yield 1;  yield 2;  yield 3;};[...myIterable]; // [1, 2, 3]

Iterables Built-in (Iteráveis Embutidos)

String,Array,TypedArray,Map eSet são iteráveis embutidos, pois o protótipo dos objetos de todos eles têm o métodoSymbol.iterator.

Syntaxes expecting iterables

Algumas declarações e expressões esperam por iteradores, por exemplo ofor-of loops,spread operator,yield*, edestructuring assignment.

js
for (let value of ["a", "b", "c"]) {  console.log(value);}// "a"// "b"// "c"[..."abc"]; // ["a", "b", "c"]function* gen() {  yield* ["a", "b", "c"];}gen().next(); // { value:"a", done:false }[(a, b, c)] = new Set(["a", "b", "c"]);a; // "a"

Generators

Enquanto os iteradores são ferramentas muito úteis, sua criação requer um cuidado devido à necessidade de manter explícito seu estado interno.Generators provêm uma alternativa poderosa: eles te permitem definir um algoritmo iterativo escrevendo uma função simples que pode manter seu estado próprio.

Generator é um tipo especial de função que trabalha como uma factory para iteradores. A função vira um generator se ela contém uma ou mais expressõesyield e se ela usa a sintaxefunction*.

js
function* idMaker() {  var index = 0;  while (true) yield index++;}var gen = idMaker();console.log(gen.next().value); // 0console.log(gen.next().value); // 1console.log(gen.next().value); // 2// ...

Generators avançados

Generators computam seus valores "yielded" por demanda, que os permitem representar sequências de forma eficiente que costumam ser trabalhosas ao serem computadas, ou até sequências infinitas como demonstradas acima.

O métodonext() também aceita um valor que pode ser usado para modificar o estado interno de um generator. O valor passado pronext() será tratado como o resultado da última expressão yield que pausou o generator.

Aqui um gerador de sequência Fibonacci usandonext(x) pra restartar a sequência:

js
function* fibonacci() {  var fn1 = 1;  var fn2 = 1;  while (true) {    var current = fn2;    fn2 = fn1;    fn1 = fn1 + current;    var reset = yield current;    if (reset) {      fn1 = 1;      fn2 = 1;    }  }}var sequence = fibonacci();console.log(sequence.next().value); // 1console.log(sequence.next().value); // 1console.log(sequence.next().value); // 2console.log(sequence.next().value); // 3console.log(sequence.next().value); // 5console.log(sequence.next().value); // 8console.log(sequence.next().value); // 13console.log(sequence.next(true).value); // 1console.log(sequence.next().value); // 1console.log(sequence.next().value); // 2console.log(sequence.next().value); // 3

Nota:Como um ponto de interesse, chamandonext(undefined) é o mesmo que chamarnext(). Entretanto, estartar um novo generator com qualquer valor que não seja undefined na chamada next() teráTypeError exception.

Você pode forçar um generator a lançar uma exceção chamando o seu métodothrow() e passando o valor da exceção que ele deve lançar. Essa exceção será lançada do contexto suspenso atual do generator, como se oyield atualmente suspenso fosse umthrow.

Se um yield não for encontrado durante o processo de lançamento de um thrown exception, então o exception será propagado através da chamada dothrow(), e pra subsequente chamada donext() que terá a propriedade done resultando emtrue.

Generators têm o métodoreturn(value) que retorna o valor pego e finaliza o generator.

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp