Iterator迭代器
它的作用一共有三个:
- 第一是为各种数据结构,提供一个统一的、简便的访问接口
- 第二使得数据结构的成员能够按某种次序排列
- 第三ES6创造了一种新的遍历命令for…of循环,Iterator接口主要供for…of循环
1.Iterator原理解释
2.给对象添加iterator
一、iterator原理解释
我们先简单写一个数组,然后通过for of 遍历
let arr = ["aaa","bbb","ccc"];
for(let i of arr){
console.log(i)
}
console.log(arr)
我们点开这个数组的原型,就会发现其中包含了一个名为 Symbol.iterator的方法
let arr = ["aaa","bbb","ccc"];
for(let i of arr){
console.log(i)
}
console.log(arr)
let iter = arr[Symbol.iterator]()
console.log(iter)
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
- Array
- Set
- Map
- String
- arguments对象
- NodeList对象
拿字符串测试以下是否具有iterator接口
let arr = "starry";
for(let i of arr){
console.log(i)
}
console.log(arr)
let iter = arr[Symbol.iterator]()
console.log(iter)
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
let obj = {
0:"aaa",
1:"bbb",
2:"ccc",
}
for(let i of obj){
console.log(i)
}
let obj = {
code: 200,
name: "starry",
list: [1, 2, 3, 4]
}
for (let i of obj) {
console.log(i)
}
上面的代码,直接for of 肯定会报错,假如我们想要遍历list的内容怎么办,也许你会说,直接obj.list就可以实现遍历,但是如果obj是别人私有的库呢,list是一个私有属性呢?所以转换身份,我们作为一个JS库开发者,写了一个对象,想让别人轻松使用for of 遍历自己对象的内容,就需要自己手动写一个iterator。
let obj = {
code: 200,
name: "starry",
list: ["A", "B", "c"],
[Symbol.iterator](){
let index = 0;
return {
next:() => {
return {value:this.list[index++],done: index === (this.list.length+1) ? true : false}
}
}
}
}
for(let i of obj){
console.log(i)
}
let iter = obj[Symbol.iterator]()
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
let obj = {
code: 200,
name: "starry",
list: ["A", "B", "c"],
[Symbol.iterator](){
let index = 0;
return {
next:() => {
return {value:this.list[index++],done: index === (this.list.length+1) ? true : false}
}
}
}
}
console.log(...obj)