迭代器(iterator)
一、什么是迭代?
从一个数据集合中按照一定的顺序,不断的取出数据的过程(很容易就想到遍历)。
二、迭代和遍历有什么区别?
- 迭代强调是依次取出,不能确定取出的有多少,也不能保证把数据全部取完;
- 遍历必须保证知道了数据的长度,循环不断的全部取出,针对于数据量过大的使用遍历需要的时间很长
三、迭代器
迭代器是一个带有特殊接口的对象,自己带有next()方法,next ()方法会返回当前位置的对象,调用后得到一个包含value和done属性的对象,value属性表示当前属性的值,done用于判断是否遍历结束,当 done 为 true 时则遍历结束。
迭代器是对迭代过程的封装,通常表现为对象的数据形式(当然也可以使用数组去迭代),不同的语言中,表现出来的迭代形式不一样
四、迭代模式
一种设计模式,用于统一迭代的过程,并且规范迭代器的规格。
五、迭代协议
- 迭代器有得到下一个数据的能力
- 判断是否有后续数据的能力
六、迭代对象
只要满足迭代协议的对象,就是迭代对象。
迭代器的遍历过程
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异常。