生成器就是通过构造函数Generator创建出来的一个对象,这个对象及时一个迭代器,同时又是一个可迭代的对象。
所谓“生成器”,其实是一个函数,但是这个函数的行为会比较特殊:
它并不直接执行逻辑,而是用来生成另一个对象(这也正是“生成器”的含义)它所生成的对象中的函数可以把逻辑拆开来,一片一片调用执行,而不是像普通的函数,只能从头到尾一次执行完毕生成器的语法和普通函数类似,特殊之处在于:
字面量(函数声明/函数表达式)的关键字function后面多了一个*,而且这个*前后允许有空白字符函数体中多了yield运算符错误创建:
let generator = new Generator(); //错误的正确创建:
function *test(){ console.log(123) yield 1; console.log(456) yield 2; console.log(789) yield 3; yield 4; yield 5; return 6;//最后返回的对象 } const generator = test(); // next symbol test函数执行返回一个对象为generator console.log(generator); generator.next();使用next方法会返回一个对象,这个对象就是一个迭代器对象,对象中的value值就是yield后面跟的值,done的判断也是判断yield
注意: 1)async 和 * 不能同时加在一个函数上,因为同时起函数修饰符的作用 2)生成器中的关键字yield 只能在函数内部使用,表示产生一个迭代数据 3) 每一次调用生成器的next方法,会将生成器函数运行带yield关键字位置
例:
function *createFeiboIterator(){ let prev1 = 1; let prev2 = 1; //定义前两位 let n = 1;//当前第几位 while(true){ if(n<=2){ yield 1; }else{ const newValue = prev1 + prev2; yield newValue; prev2 = prev1; prev1 = newValue; } n++; } } const iterator = createFeiboIterator()注意的点: 1)生成器有返回值,出现在最后一次的done为true的value中 2)调用生成器的next方法时,可以传递参数,这个参数是yield表达式的返回值 3)第一次调用函数时,传递的参数是没有任何含义的
ES6中的迭代器不仅仅就是一个内置类,它还是是语言的一个扩展点,如果你想实现自己的迭代器,只需要实现Symbol.iterator()和 next()函数即可。