- 迭代器提供了一个 Next()方法,该方法有 Done和 Value两个属性。一但初始化, Next方法可以依次访问对象中的键值。
- 生成器。 GeneratorFunction:执行时返回一个新的 Generator对象。如果使用 Function方法,会返回一个 GenerationFunction。
- 可迭代对象。为了实现可迭代,一个对象必须实现@@Iterator或原型链的一个对象,所以带有 Symbol.Iterator属性。分为自定义可迭代和内置可迭代。String,Array,TypedArray,Map和Set都内置可迭代对象,因为它们的原型对象都有一个 Symbol.Iterator方法。
- 可迭代对象的语法:For-of循环,Spread Synax,Yield*和 Destruction Assignment。
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"
高级生成器Edit节
生成器根据需求计算它们的产出值,这使得它们能够有效地表示计算成本高的序列,或者甚至如上所述的无限序列。
The Next()方法也接受可用于修改生成器内部状态的值。传递给Next()的值将被视为暂停生成器的最后一个 Yield表达式的结果。
以下是使用 Next(x) 重新启动 fibonacci 序列生成器:
function* fibonacci() {var fn1 = 0;var fn2 = 1;while (true) {var current = fn1;fn1 = fn2;fn2 = current + fn1;var reset = yield current;if (reset) {fn1 = 0;fn2 = 1;}}}var sequence = fibonacci();console.log(sequence.next().value); // 0console.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(true).value); // 0console.log(sequence.next().value); // 1console.log(sequence.next().value); // 1console.log(sequence.next().value); // 2
你可以通过调用其 Throw()方法强制生成器抛出异常,并传递应该抛出的异常值。这个异常将从当前挂起的生成器的上下文中抛出,就好像当前挂起的 Yield是一个 Throwvalue语句。
如果在抛出的异常处理期间没有遇到 Yield,则异常将通过调用 Throw()向上传播,对 Next()的后续调用将导致 Done属性为 True。
生成器具有 Return(value)方法,返回给定的值并完成生成器本身。
