首先让我们了解一下迭代器 iterator 是什么
迭代器(iterator)是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署iterator接口,就可以完成便遍历操作。
说起迭代器,想必对ES6有了解的同学应该不会陌生。我们知道,for...of 遍历的对象必须是迭代器对象,而普通对象则不能。
因为普通对象内部没有实现迭代器,而像数组则内部实现了迭代器,所以可以用for...of 的语法,而对于一般对象在ES5中有专门的处理方法,for...in 和 Object.keys() ,而 for...in 可遍历所有的对象,但是它遍历特殊对象,如数组,也会遍历它的length,这并不是我们需要的,有时还会出现不按顺序的遍历。
在我们日常使用中一般是将普通对象转化为特殊对象然后处理的。
我们直接可以清楚iterator接口主要供for ... of使用。
原生具备iterator接口的数据(简单来说就是可以使用for…of循环遍历的数据)如下所示。
a. Array
b. arguments
c. Set
d. Map
e. String
f. TypeArray
g. NodeList
迭代器iterator工作原理
a. 创建一个指针对象,指向当前数据结构的起始位置。
b. 第一次调用对象的next方法,指针自动指向数据结构的第一个成员。
c. 接下来不断的调用next方法,指针一直往后移动,直到指向最后一个成员。
d. 每调用next方法返回一个包含value和done属性的对象,当value的值为undefined时,done的值为true,当done的值为true时,调用终止。
举个栗子🌰 for of iterator 实现原理
obj ={
name:"张三",
age:[66,11,12,3,12,1,2231,3,2,123,1,3,2],
//这里的Symbol.iterator 就代表着内置的 iterator方法
[Symbol.iterator](){
let index = 0
return {
next:()=>{
if(index < this.age.length){
index++
//这里的value就代表着每次返回的结果
return {values:this.age[index-1],done:false}
}else{
//一直到循环遍历完
return {values:undefined,done:true}
}
}
}
}
}
// 声明变量接受每次所return出来的值
let item = obj[Symbol.iterator]()
console.log(item.next()) //第一次打印结果 66
console.log(item.next()) //以此类推
一直到最后返回结果 undefined done true结束
运行结果:
可以清楚看到,当指针对象指向最后一个元素的时候,返回{values: undefined, done: true}
欢迎指正! 有啥其他的会继续添加。