迭代器

94 阅读2分钟

迭代器

常见的可迭代数据结构:arraysetmap

iterator遍历过程

第一次调用指针对象的next方法,可以指向数据结构的第一个成员,不断调用next,直到它指向数据结构的结束位置

let arr=[1,2,3]
let iterator=arr[Symbol.iterator]()
iterator.next()//{value:1,done:false}
iterator.next()//{value:2,done:false}
iterator.next()//{value:3,done:false}
iterator.next()//{value:undefined,done:true}

for of原理

只有含有 iterator接口的数据结构才可以进行迭代遍历,它会返回对应对象的value(done为false的对象)

let arr=[1,2,3]
for(let i of arr){
	console.log(i)  // 1,2,3
}

for of 本质上就是获取数据解构的迭代器,每次遍历,调用迭代器的next方法,i: 即next()方法返回对象的value值

注意:对象是不可以直接进行迭代的。如果想要迭代,需要自己设置

[Symbol.iterator](){}

自实现对象迭代

    let obj = {
                a: 1,
                b: 2,
                [Symbol.iterator]() {
                    let length = Object.keys(this).length
                    let value = Object.values(this)
                    let index = 0
                    let self = this
                    return {
                        next() {
                            if (index < length) {
                                return {
                                    value: value[index++],
                                    done: false,
                                }
                            } else {
                                return { value: undefined, done: true }
                            }
                        },
                    }
                },
            }
  //这时候迭代就可以返回对应的value值
  for (let i of obj) {
                console.log(i)  
            }    
//1
//2

解构、扩展运算

数组或者set进行解构赋值的时候,会自动调用iterator接口的next方法进行迭代,或者进行扩展运算符运算的时候,也会自动调用iterator接口的next方法进行迭代。

最后返回的值其实就是for of 迭代后每次的value值

 let [a, b] = obj
            let test = { a: 1, b: 2 }
            console.log(a, b) //1,2
            console.log(...obj) //1,2
            console.log(...test) //报错 不含有iterator接口

案例题目:

使得以下代码成立

let [a,b]={a:1,b:2}

实现方法:给obj对象添加[Symbol.iterator]

方式①:

  let obj = {
                a: 1,
                b: 2,
                [Symbol.iterator]() {
                    let length = Object.keys(this).length
                    let value = Object.values(this)
                    let index = 0
                    let self = this
                    return {
                        next() {
                            if (index < length) {
                                return {
                                    value: value[index++],
                                    done: false,
                                }
                            } else {
                                return { value: undefined, done: true }
                            }
                        },
                    }
                },
            }

方式②:偷懒,直接返回相应数组的迭代器

   let obj = {
                a: 1,
                b: 2,
                [Symbol.iterator]() {
                    let arr = Object.values(this)
                    return arr[Symbol.iterator]()
                },
            }
            let [a, b] = obj