ES6补充之生成器

    技术2025-09-08  38

    什么是生成器?

    生成器就是通过构造函数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()函数即可。

    总结

    在生成器函数中,yield关键字可以有多个 quips(“Xjorendorff”)只是返回一个暂停的生成器对象 如果不调用生成器函数对象的next()方法,生成器的内部代码不会被执行 每调用一次next()方法,只执行完下一个yield关键字修饰的语句,调用完成就挂起,继续执行生成器函数外的其他的语句。 多执行一次next()语句才能执行是否执行完毕。如果不多执行一次,后面的普通代码无法执行。
    Processed: 0.011, SQL: 9