JS中的迭代器iterator

734 阅读2分钟

首先让我们了解一下迭代器 iterator 是什么

迭代器(iterator)是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署iterator接口,就可以完成便遍历操作。

说起迭代器,想必对ES6有了解的同学应该不会陌生。我们知道,for...of 遍历的对象必须是迭代器对象,而普通对象则不能。

因为普通对象内部没有实现迭代器,而像数组则内部实现了迭代器,所以可以用for...of 的语法,而对于一般对象在ES5中有专门的处理方法,for...inObject.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方法返回一个包含valuedone属性的对象,当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}

image.png

欢迎指正! 有啥其他的会继续添加。