ES6迭代器(iterator)和生成器(generator)

迭代器(iterator)

一、什么是迭代?

从一个数据集合中按照一定的顺序,不断的取出数据的过程(很容易就想到遍历)。

二、迭代和遍历有什么区别?

  • 迭代强调是依次取出,不能确定取出的有多少,也不能保证把数据全部取完;
  • 遍历必须保证知道了数据的长度,循环不断的全部取出,针对于数据量过大的使用遍历需要的时间很长

三、迭代器

迭代器是一个带有特殊接口的对象,自己带有next()方法,next ()方法会返回当前位置的对象,调用后得到一个包含value和done属性的对象,value属性表示当前属性的值,done用于判断是否遍历结束,当 done 为 true 时则遍历结束。
迭代器是对迭代过程的封装,通常表现为对象的数据形式(当然也可以使用数组去迭代),不同的语言中,表现出来的迭代形式不一样

四、迭代模式

一种设计模式,用于统一迭代的过程,并且规范迭代器的规格。

五、迭代协议

  1. 迭代器有得到下一个数据的能力
  2. 判断是否有后续数据的能力

六、迭代对象

只要满足迭代协议的对象,就是迭代对象。

迭代器的遍历过程

1、通过 Symbol.iterator 创建一个迭代器,指向当前数据结构的起始位置。
2、调用next 方法进行向下迭代指向下一个位置,可以将指针指向数据结构的第一个成员。
3、再调用next 方法向下迭代指向下一个位置,可以将指针指向数据结构的下一个成员。
4、不断调用指针对象的 next 方法,直到它指向数据结构的结束位置。

迭代器的实现

let king = {
    name: '四大天王',
    person: ['刘德华', '张学友', '郭富城', '黎明'],
    [Symbol.iterator]() {
        let index = 0
        // console.log(this)
        let that = this
        return {
           next: function() {
           		// console.log(this)
                if (index < that.person.length) {
                    let result = {
                        value: that.person[index],
                        done: false
                    }
                    index++
                    return result
                } else {
                     return {
                        value: undefined,
                        done: true
                     }
                }
           }
        }
    }
}

// king[Symbol.iterator]().next()
console.log(king)
for (let v of king) {
   console.log(v)
}

生成器(generator)

一、什么是生成器

生成器就是通过构造函数Generator创建出来的对象,生成器既是一个迭代器,同时又是一个可迭代的对象。

二、如何创建生成器

function* test() {
}
const generator = test();

生成器与迭代器的区别

  • 迭代器(iterator)是一个实现了迭代器协议(iter和next()方法)的对象。
  • 生成器(generator)是通过yield语句或生成器函数快速生成迭代器,可以不用iter和next方法 。
  • 生成器本质上也是一个迭代器,自己实现了可迭代协议,与迭代器不同的是生成器的实现方式不同,可以通过生成器表达式和生成器函数两种方式实现,代码更简洁。
  • 生成器和迭代器都是惰性可迭代对象,只能遍历一次,数据取完抛出Stopiteration异常。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值