美文网首页
迭代器和生成器区别

迭代器和生成器区别

作者: AAA前端 | 来源:发表于2021-08-24 11:48 被阅读0次

    迭代器

    迭代器是一种特殊对象,它具有一些专门为迭代过程设计的专有接口, 所有的迭代对象都有一个next 方法, 每次调用都返回一个结果对象。结果对象有两个属性:

    • 一个是value,表示下一个将要返回的值
    • 另一个是done, 布尔值,表示没有更多数据时返回true.
      迭代器还会保存一个内部指针,用来指向当前集合中值的位置,每次调用一次next()方法,都会返回下一个可用的值。

    生成器

    生成器是一种返回迭代器的函数,通过function关键字后的星号(*)来表示,函数中会用到新的 关键字 yield.星号可以紧挨着function关键字,也可以在中间添加空格。

    function *createIterator(){
      yield 1;
      yield 2;
      yield 3;
    }
    
    let iterator = createIterator();
    console.log(iterator.next().value); //1
    console.log(iterator.next().value); //2
    console.log(iterator.next().value); //3
    

    生成器的调用方式与普通函数相同,只不过返回的是一个迭代器。

    yield关键字值可在生成器内部使用,在其他地方使用会导致程序抛出语法错误,几遍在生成器内部的函数中使用也会报错。

    可迭代对象和for-of循环

    可迭代对象具有Symbol.iterator属性,是一种与迭代器密切相关的对象。Symbol.iterator通过指定的函数可以返回一个作用于附属对象的迭代器。
    ES6中,所有的集合对象(数组,对象,Set集合,Map集合)和字符串都是可迭代对象,这些对象都有默认的迭代器。 ECMAScript中新加入的特性for-of循环需要用到迭代器对象的这些功能。

    内建迭代器

    ES6中已经默认为许多内建类型提供了内建迭代器,只有当这些内建迭代器无法实现你的目标时才需要自己创建,通常是自定义的对象和类时,才会遇到这种情况。

    集合对象迭代器

    ES6中有3中类型的集合对象:数组、Map集合,Set集合。为了更好的访问对象中的内容,这三种对象都内建了三种迭代器:

    • entries() 返回一个迭代器,其值为多个键值对
    • values() 返回一个地打起,其值为集合在值
    • keys() 返回一个迭代器,其值为集合中的所有键名

    参考:深入理解ES6

    相关文章

      网友评论

          本文标题:迭代器和生成器区别

          本文链接:https://www.haomeiwen.com/subject/tdlliltx.html