Esta página foi traduzida do inglês pela comunidade.Saiba mais e junte-se à comunidade MDN Web Docs.
yield*
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since setembro de 2016.
Aexpressãoyield* é usada para delegar para outro objetogenerator ou iterable.
In this article
Sintaxe
yield* [[expressão]];
expressãoA expressão que retorna um objeto iterable.
Descrição
A expressãoyield* itera sobre a operação e yields cada valor retornado por ele.
O valor da expressãoyield* sozinha é o valor retornado pelo iterator quando ele for fechado (i.e., quandodone étrue).
Exemplos
>Delegando para outro generator
No código seguinte, valores "yeldados" porg1() são retornados pornext() chamam apenas os que foram "yeldados" porg2().
function* g1() { yield 2; yield 3; yield 4;}function* g2() { yield 1; yield* g1(); yield 5;}var iterator = g2();console.log(iterator.next()); // {value: 1, done: false}console.log(iterator.next()); // {value: 2, done: false}console.log(iterator.next()); // {value: 3, done: false}console.log(iterator.next()); // {value: 4, done: false}console.log(iterator.next()); // {value: 5, done: false}console.log(iterator.next()); // {value: undefined, done: true}Outros objetos Iterables
Além de objetos generator,yield* também podemyield outros tipos de objetos iterables, e.g. arrays, strings ou objetos de argumentos.
function* g3() { yield* [1, 2]; yield* "34"; yield* Array.from(arguments);}var iterator = g3(5, 6);console.log(iterator.next()); // {value: 1, done: false}console.log(iterator.next()); // {value: 2, done: false}console.log(iterator.next()); // {value: "3", done: false}console.log(iterator.next()); // {value: "4", done: false}console.log(iterator.next()); // {value: 5, done: false}console.log(iterator.next()); // {value: 6, done: false}console.log(iterator.next()); // {value: undefined, done: true}O valor da expressãoyield* sozinha
yield* é uma expressão, não uma declaração, então ele espera um valor.
function* g4() { yield* [1, 2, 3]; return "foo";}var result;function* g5() { result = yield* g4();}var iterator = g5();console.log(iterator.next()); // {value: 1, done: false}console.log(iterator.next()); // {value: 2, done: false}console.log(iterator.next()); // {value: 3, done: false}console.log(iterator.next()); // {value: undefined, done: true},// g4() returned {value: 'foo', done: true} nesse pontoconsole.log(result); // "foo"Especificações
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-generator-function-definitions-runtime-semantics-evaluation> |
Compatibilidade com navegadores
Notas específicas do Firefox
- A partir do Gecko 33, o tratamento da expressão yield foi atualizado para se conformar com a espeficação do ES2015 (Erro do Firefox 981599):
A restrição de linha finalizadora agora está implementada. Nenhuma linha finalizadora entre "yield" e "*" é permitida. Código como o a seguir irá invocar uma exception
SyntaxError:jsfunction* foo() { yield *[];}