JS 迭代器
迭代器:迭代器(iterator),是使用户在容器对象(container,例如链表或数组)上可以遍历访问的对象,使用该接口无需关心容器对象的内部实现细节。
从迭代器的定义我们可以看出来,迭代器是帮助我们对 “某个数据结构进行遍历” 的对象。
在JavaScript中,迭代器也是一个具体的对象,这个对象需要符合迭代器协议(iterator protocol):
1.迭代器协议定义了产生一系列值(无论是有限还是无限个)的标准方式;
2.在JavaScript中这个标准就是一个特定的next方法;
next方法要求:next方法是一个无参数或者有一个参数的函数,返回结果应当拥有以下两个属性的对象:
1.done(boolean) : done返回一个布尔值: 可能是false, 可能是true
·如果迭代器可以产生序列中的下一个值,则为 false。(这等价于没有指定 done 这个属性。)
·如果迭代器已将序列迭代完毕,则为 true。这种情况下,value 是可选的,如果它依然存在,即这个值为迭代结束之后默认返回值。
2. value:value的返回值: 可能是一个具体的值, 可能是undefined
·迭代器返回的任何 JavaScript 值。done 为 true 时可省略
迭代器:
1.迭代器是一个对象 首先我们创建一个对象
2.迭代器中有一个next方法, 这个函数要求无参数或者仅有一个参数, 在对象中添加next方法
3.next方法需要返回一个对象, 且对象中需要包含done和value两个属性
可迭代对象:当一个对象实现了iterable protocol协议时,它就是一个可迭代对象;
1. 是必须实现 @@iterator (这是规范的名字) 方法,在代码中我们使用 [Symbol.iterator] (这是实际用的名字)访问该属性;
2.这个[Symbol.iterator] 方法需要返回一个迭代器
class Person { // 首先创建一个对象
constructor(name, age, friends) {
this.name = name
this.age = age
this.friends = friends
}
// 添加实例方法, 迭代协议
[Symbol.iterator] () {
let index = 0
return { // 必须返回迭代器
// 将next方法改为箭头函数, 这样next方法中就不在绑定this, this回去上层作用域中寻找, 上层作用域中的this会指向info
next: () => {
if (index < this.friends.length) {
return { done: false, value: this.friends[index++] }
} else {
return { done: true }
}
},
// 添加一个return方法, 用于监听迭代中断, 当迭代器中断就会执行return方法
return: () => {
console.log("监听到迭代器中断")
// 迭代器需要返回对象
return { done:true }
}
}
}
}
const p1 = new Person("kaisa", 18, ["aaa", "bbb", "ccc"])
for (item of p1) {
console.log(item) // aaa bbb
// 如果在某种情况写退出了循环, 我们需要告知迭代器
if (item === "bbb") {
break
}
}
迭代器特性
1.可迭代对象可以使用展开语法普通对象不可使用展开语法:for …of、展开语法、yield*、解构赋值;
2.创建一些对象:new Map([Iterable])、new WeakMap([iterable])、new Set([iterable])、new WeakSet([iterable]);
3.方法调用:Promise.all(iterable)、Promise.race(iterable)、Array.from(iterable)