generator(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次。
generator和函数不同的是,generator由function*
定义(注意多出的*号),并且,除了return
语句,还可以用yield
返回多次。
// 生成器可以暂停函数的运行 // 可以通过yield 产出对应的值(由next参数决定) // 传出的值是z字型的方式 // 生成器 + 执行器函数 就是async function* test() { let value1 = yield 1; console.log(value1); let value2 = yield 2; console.log(value2); let value3 = yield 3; console.log(value3); let value4 = yield 4; console.log(value4); } let iter = test(); console.log(iter.next("one")); // {value: 1, done:false} // two console.log(iter.next("two")); // {value: 2, done:false} // three console.log(iter.next("three")); // {value: 3, done:false} // four console.log(iter.next("four")); // {value: 4, done:false} // undefined console.log(iter.next()); // {value: undefined, done:true} // 重写迭代器接口 let obj = { a: 1, b: 2, c: 3, [Symbol.iterator]: function* () { let index = 0; let map = new Map(); map.set("a", 1); map.set("b", 2); map.set("c", 3); let mapEntries = [...map.entries()]; while (index < mapEntries.length) { yield mapEntries[index++]; } }, }; for (let i of obj) { console.log(i); } // ['a', 1] // ['b', 2] // ['c', 3]