迭代器对象function *

90 阅读1分钟

问你generator是什么?

迭代器

一旦遇到 yield 表达式,生成器的代码将被暂停运行,直到生成器的 next() 方法被调用。每次调用生成器的next()方法时,生成器都会恢复执行,直到达到以下某个值:

  • yield, 导致生成器再次暂停并返回生成器的新值。下一次调用next()时,在yield之后紧接着语句继续执行。

  • throw, 用于从生成器抛出异常。这让生成器完全停止执行,并在调用者中继续执行,正如通常情况下抛出异常一样。

  • 到达生成器函数的结尾;在这种情况下,生成器的执行结束,并且IteratorResult给调用者返回undefined并且done为true。

  • 到达return语句。在这种情况下,生成器的执行结束,并将IteratorResult返回给调用者,其值是由return语句指定的,并且done为true。

生成器函数声明

function* countAppleSales () {
    const saleList = [3, 7, 5]
    for (const i = 0; i < saleList.length; i++) {
        yield saleList[i]
    }
}

一旦生成器已定义,可以通过构造一个迭代器来使用它

const appleStore = countAppleSales() // Generator { }

console.log(appleStore.next()) // { value: 3, done: false }
console.log(appleStore.next()) // { value: 7, done: false }
console.log(appleStore.next()) // { value: 5, done: false }
console.log(appleStore.next()) // { value: undefined, done: true }

一个无限迭代器

function* idMaker() {
    let index = 0
    while(true)
        yield index++
}

let gen = idMaker() // "Generator { }"

console.log(gen.next().value) // 0
console.log(gen.next().value) // 1
console.log(gen.next().value) // 2
// ...

yield*的示例

function* anotherGenerator(i) {
  yield i + 1;
  yield i + 2;
  yield i + 3;
}

function* generator(i){
  yield i;
  yield* anotherGenerator(i);// 移交执行权
  yield i + 10;
}

var gen = generator(10);

console.log(gen.next().value); // 10
console.log(gen.next().value); // 11
console.log(gen.next().value); // 12
console.log(gen.next().value); // 13
console.log(gen.next().value); // 20

向生成器传值

function* idMaker(){
    console.log(arguments) // Arguments [5, callee: ƒ, Symbol(Symbol.iterator): ƒ]
    var index = arguments[0] || 0;
    console.log(index) // 5
    while(true)
        yield index++; // index++ 先返回后加1
}

var gen = idMaker(5);
console.log(gen.next().value); // 5
console.log(gen.next().value); // 6