迭代器
常见的可迭代数据结构:array、 set、map
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