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 (ECMA-262) Die Definition von 'Yield' in dieser Spezifikation. |
Lebender Standard |
Browserkompatibilität
BCD tables only load in the browser
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