迭代器
Iterator(迭代器)
- 定义: 是一个对象,用来帮助我们遍历某一个数据结构
- 标准[迭代器协议(iterator protocol)]:
(1) 必须有一个next函数,并且该函数没有参数或者只有一个参数
(2) next函数必须返回一个对象,并且该对象里包含done和value属性
done 属性: 遍历的每一个属性,赋值为false,遍历完成全部属性后,最后会再访问一次,赋值为true,对应value属性的undefined
value属性: 遍历的每项的值,全部的值遍历完成后,最后会再访问一次,生成一个undefined的值对应 done:trueconst arr=[1,2,3,4,5] let index=0 const iterObj={ next() { if(index>=arr.length) { return {done: true,value: undefiend} } else { return {done: false,value: arr[index++]} } } } console.log(iterObj.next()) --> {done: false, value: 1} console.log(iterObj.next()) --> {done: false, value: 2} console.log(iterObj.next()) --> {done: false, value: 3} console.log(iterObj.next()) --> {done: false, value: 4} console.log(iterObj.next()) --> {done: false, value: 5} console.log(iterObj.next()) --> {done: true, value: undefined}
备注:如果done一直不为true,那么这个迭代器就是无限迭代器(使用较少)
可迭代对象
- 定义: 当一个对象实现了iterable protocol(可迭代协议)时,它就是一个可迭代对象
- 标准[ 可迭代协议]:
(1) 必须实现一个[Symbol.iterator]函数
(2) 该函数必须返回一个迭代器
const interableObj={
names: [1,3,5],
[Symbol.iterator]() {
let index=0
return {
next: () => {
if(index<this.names.length) {
return {done: false,value: this.names[index++]}
} else {
return {done: true,value: undefined}
}
}
}
}
}
console.log(interableObj[Symbol.iterator]().next())-->{done: false,value: 1}
注意: for..of..就是调用next函数循环调用的语法糖
应用场景
- for..of..语法糖
- 展开运算符(对象的展开不是迭代器,而是新的一个语法,因为对象不是可迭代对象)
- 解构(对象的解构不是迭代器,而是新的一个语法,因为对象不是可迭代对象)
- new Set( ),Array.from( ),promise.All( )传递的参数都得是可迭代对象
自定义类可迭代对象
- 可以在类里面直接创建[Symbol.iterator]函数
class ClassRom{ constructor(){} [Symbol.iterator](){ return { next:() =>{ return { done:false, value:'a' } }, /* 迭代终止时的提示 */ return: ()=>{ console.log( '迭代器终止了~' ) return { done:true, value: undefined } } } } }
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!