◼ 但是上面的代码整体来说看起来是有点奇怪的:
我们获取一个数组的时候,需要自己创建一个index变量,再创建一个所谓的迭代器对象;
事实上我们可以对上面的代码进行进一步的封装,让其变成一个可迭代对象;
◼ 什么又是可迭代对象呢?
它和迭代器是不同的概念;
当一个对象实现了iterable protocol协议时,它就是一个可迭代对象;
这个对象的要求是必须实现@@iterator 方法,在代码中我们使用Symbol.iterator 访问该属性;
◼ 当然我们要问一个问题,我们转成这样的一个东西有什么好处呢?
当一个对象变成一个可迭代对象的时候,就可以进行某些迭代操作;
比如for...of 操作时,其实就会调用它的@@iterator 方法;
手写一个可迭代对象
// 将infos变成可迭代对象
//1.必须有一个函数叫:[Symbol.iterator]
//2.这个函数需要返回一个迭代器(这个迭代器用于返回当前这个对象)
//3.
const infos = {
friends:["kebo","james","curry"],
[Symbol.iterator](){
let index = 0
const infosIterator = {
next(){
if(index < infos.friends.length){
return {done:false,value:infos.friends[index++]}
}
else{
return{done:true,value:undefined}
}
}
}
return infosIterator
}
}
// 可迭代对象必然具备下面的特点
// 一定可以这样拿到一个函数执行后一定拿到一个迭代器
const iterator = infos[Symbol.iterator]()
// 一定可以通过迭代器.next()
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
// 可迭代对象可以进行for..of
for(const item of infos){
console.log(item)
}
标签:console,迭代,iterator,对象,next,infos
From: https://www.cnblogs.com/hdc-web/p/18488942