迭代器
什么是迭代器?
◼ 迭代器(iterator),使用户在容器对象(container,例如链表或数组)上遍访的对象,使用该接口无需关心对象的内部实现细节。
其行为像数据库中的光标,迭代器最早出现在1974年设计的CLU编程语言中;
在各种编程语言的实现中,迭代器的实现方式各不相同,但是基本都有迭代器,比如Java、Python等;
◼ 从迭代器的定义我们可以看出来,迭代器是帮助我们对某个数据结构进行遍历的对象。
◼ 在JavaScript中,迭代器也是一个具体的对象,这个对象需要符合迭代器协议(iterator protocol):
迭代器协议定义了产生一系列值(无论是有限还是无限个)的标准方式;
在JavaScript中这个标准就是一个特定的next方法;
◼ next方法有如下的要求:
一个无参数或者一个参数的函数,返回一个应当拥有以下两个属性的对象:
done(boolean)
✓ 如果迭代器可以产生序列中的下一个值,则为false。(这等价于没有指定done 这个属性。)
✓ 如果迭代器已将序列迭代完毕,则为true。这种情况下,value 是可选的,如果它依然存在,即为迭代结束之后的默认返回值。
value
✓ 迭代器返回的任何JavaScript 值。done 为 true 时可省略。
为单独数组创建迭代器
const names = ["abc","bbb","ccc"]
// 迭代这个names要先创建一个迭代器
let index = 0
//给数组names创建一个迭代器(names的迭代器)
const namesIterator={
//1.必须有一个next方法
next:function(){
//next方法必须返回俩个属性
if(index <names.length){
return {
done:false,//done可以是true/false--->完成所有迭代后done的值才为true默认是false
value:names[index++]//value必须是具体值或者undefined
}
}
else{
return {
done:true,//done可以是true/false--->完成所有迭代后done的值才为true默认是false
value:undefined//value必须是具体值或者undefined
}
}
}
}
const value1 = namesIterator.next()//return {done:false,value:"abc"}
const value2 = namesIterator.next()//return {done:false,value:"bbb"}
const value3 = namesIterator.next()//return {done:false,value:"ccc"}
const value4 = namesIterator.next()//return {done:true,value:"undefined"}
console.log(value1)
console.log(value2)
console.log(value3)
console.log(value4)
为所有数组创建迭代器
const names = ["aaa","bbb","ccc"]
const nums = [111,222,333,444]
// 封装函数
function createArrayIterator(arr){
let index = 0
const Iterator = {
next(){
if (index < arr.length){
return {done:false,value:arr[index++]}
}else{
return {done:true,value:undefined}
}
}
}
return Iterator
}
// 给names创建迭代器
const namesIterator = createArrayIterator(names)
console.log(namesIterator.next())
console.log(namesIterator.next())
console.log(namesIterator.next())
console.log(namesIterator.next())
const numsIterator = createArrayIterator(nums)
console.log(numsIterator.next())
console.log(numsIterator.next())
console.log(numsIterator.next())
console.log(numsIterator.next())
console.log(numsIterator.next())