--- title: yield* slug: Web/JavaScript/Reference/Operators/yield* translation_of: Web/JavaScript/Reference/Operators/yield* original_slug: Web/JavaScript/Referencje/Operatory/yield* ---
Wyrażenie yield*
służy do wydelegowania działania generatora do innego {{jsxref("Statements/function*", "generatora")}} lub obiektu iterowalnego.
Źródło poniższego interaktywnego przykładu przechowywane jest w repozytorium na GitHub. Jeśli chcesz współtworzyć projekt interaktywnych przykładów, sklonuj https://github.com/mdn/interactive-examples i wyślij nam pull request.
yield* [[expression]];
expression
yield*
iteruje po iterowalnym obiekcie i wywołuje yield
z każdą kolejną zwracaną przez niego wartością.
Wartość samego yield*
jest wartością zwróconą przez iterator w momencie jego zakończenia (tzn. kiedy done
ma wartość true
).
W poniższym kodzie wartości yeld
dla g1()
zwracane są przy wywołaniu next()
dokładnie tak samo jak te, które zwraca yeld
generatora g2()
.
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}
yield*
może wywoływać yield
z wartościami dostarczanymi przez inne rodzje obiektów iterowalnych , np. tablice, stringi lub obiekt arguments
.
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}
yield*
yield*
jest wyrażeniem (expression) a nie statement, więc rozwiązuje się do konkretnej wartości.
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() zwrócił w tym momencie {value: 'foo', done: true} console.log(result); // "foo"
Specification | Status | Comment |
---|---|---|
{{SpecName('ES2015', '#', 'Yield')}} | {{Spec2('ES2015')}} | Initial definition. |
{{SpecName('ESDraft', '#', 'Yield')}} | {{Spec2('ESDraft')}} |
{{CompatibilityTable}}
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
Basic support | {{CompatVersionUnknown}} | {{CompatGeckoDesktop("27.0")}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatSafari("10")}} |
Feature | Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Basic support | {{CompatVersionUnknown}} | {{CompatGeckoMobile("27.0")}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatSafari("10")}} |
function* foo() { yield *[]; }