Der yield* Ausdruck wird eingesetzt um an einen anderen Generator oder iterierbares Objekt zu delegieren.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Syntax
yield* [[expression]];
expression- Der Ausdruck, der ein Iterierbares Objekt zurückgibt.
Beschreibung
Das yield* Ausdrucksliteral iteriert über den Operanden und gibt jeden zurückgegebenen Wert zurück.
Der Wert von yield* Ausdrücken selbst ist der Wert der vom Iterator zurückgegeben wird, wenn der geschlossen wird (z. B., wenn done true ist).
Beispiele
Zu einem anderen Generator delegieren
Im folgenden Code werden Werte von g1() und g2() beim Aufruf von next() zurückgegeben.
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}
Andere Iterable Objekte
Neben Generatorobjekten kann yield* auch andere Iterable Objekte wie Arrays, Strings oder Arguments-Objekte zurückgeben.
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}
Der Wert des yield* Ausdrucks selbst
yield* ist ein Ausdruck, kein Statement, weshalb es zu einem Wert ausgewertet wird.
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} at this point
console.log(result); // "foo"
Spezifikationen
| Spezifikation | Status | Kommentar |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) Die Definition von 'Yield' in dieser Spezifikation. |
Standard | Initiale Definition. |
| ECMAScript Latest Draft (ECMA-262) Die Definition von 'Yield' in dieser Spezifikation. |
Entwurf |
Browserkompatibilität
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
yield* | Chrome Vollständige Unterstützung 39 | Edge Vollständige Unterstützung 12 | Firefox
Vollständige Unterstützung
27
| IE Keine Unterstützung Nein | Opera Vollständige Unterstützung 26 | Safari Vollständige Unterstützung 10 | WebView Android Vollständige Unterstützung 39 | Chrome Android Vollständige Unterstützung 39 | Firefox Android
Vollständige Unterstützung
27
| Opera Android Vollständige Unterstützung 26 | Safari iOS Vollständige Unterstützung 10 | Samsung Internet Android Vollständige Unterstützung 4.0 | nodejs
Vollständige Unterstützung
4.0.0
|
Legende
- Vollständige Unterstützung
- Vollständige Unterstützung
- Keine Unterstützung
- Keine Unterstützung
- Siehe Implementierungshinweise.
- Siehe Implementierungshinweise.
- Benutzer muss dieses Feature explizit aktivieren.
- Benutzer muss dieses Feature explizit aktivieren.
Firefox spezifische Hinweise
- Beginnend mit Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30), wurde das Einlesen des yield Ausdrucks aktualisiert, um der ES2015 Spezifikation gerecht zu werden (Bug 981599):
- Die Zeilenumbruchrestriktion ist jetzt Implementiert. Es ist kein Zeilenumbruch zwischen "yield" and "*" erlaubt. Code wie der folgende erzeugt einen
SyntaxError:function* foo() { yield *[]; }
- Die Zeilenumbruchrestriktion ist jetzt Implementiert. Es ist kein Zeilenumbruch zwischen "yield" and "*" erlaubt. Code wie der folgende erzeugt einen