生成器。
本身是函数,执行后返回迭代的对象, 内部配合yield使用,Generator函数分段执行, 遇到 yield就暂停。

function * test(){
  yield 'a';
  yield 'b';
  yield 'c';
  return 'd'
  // generator 函数
} 

var a = text()
a.next()    // {value: "a", done: false}
a.next()    // {value: "b", done: false}
a.next()    // {value: "c", done: false}
a.next()    // {value: "d", done: true}
a.next()    // {value: undefined, done: true}

再看看这个

function * test (){
    let val1 = yield 'a';
    console.log(val1)
    let val2 = yield 'b';
    console.log(val2)
    let val3 = yield 'c';
    console.log(val3)
    return 'd';
}

还记得编程语言是怎么执行复制操作的吗?
let val1 = yield 'a'; 会先执行右边的语句。然后 generator函数碰到 yield 就会暂停, 等待下一次执行next函数。

所以第一次执行不会打印出 val1 的值, 第二次调用 next 的时候才会打印出东西, 而且打印出来的也不是 yield 'a'后面的'a', 而是取决于调用 next 函数的时候, 往里面传递的什么。

实现 generator

let obj = {
    0: 'a',
    1: 'b',
    2: 'c',
    length: 3,
    [Symbol.iterator]: function *(){
        let curIndex = 0;
        while(curIndex !== this.length){
            yield this[curIndex ++]  
        }
    }
}
[...obj] // ["a", "b", "c"]