es6中,加上新增的集合对象已经有了4种(Object,Array,Set,Map),Iterator迭代器是提供遍历的统一接口,也可理解为指针。
如果某种数据结构实现了Iterator接口,就可以确定是可遍历的。
原生具有Iterator接口的数据结构有:
- Array
- Map
- Set
- String
- TypedArray
- NodeList
- 函数中的arguments
es6中规定,默认的Iterator接口部署在数据结构的Symbol.iterator属性里,换句话说,如果某个数据结构有Symbol.iterator属性,就可以拿到迭代器,也就是可以遍历的。
举个栗子:
let arr=[1,2,3,4,5];
let iterator=arr[Symbol.iterator](); //取得迭代器
iterator.next();//指针下移,取数组第一个值
...
自己定义的数据可以在原型对象上部署Symbol.iterator(或是原型链上),提供for...of遍历的能力:
//模拟学生信息
function StudentInfo(name,score){
this.name=name;//姓名
this.score=score;//分数
}
//学生列表
function StudentList(...student){
this.data=student;
this.count=student.length;
}
StudentList.prototype[Symbol.iterator]=function(){
const self=this;
var i=0;
//返回一个iterator对象,next函数用于返回当前值,并将指针下移
return {
next:function(){
if(i>=self.data.length){
return {value:undefined,done:true};
}else{
return {value:self.data[i++],done:false};
}
}
};
};
var l=new StudentList(new StudentInfo('Tom',22),new StudentInfo('Jack',88));
//部署了iterator,StudentList对象已经具有了for...of遍历的能力
for(let item of l){
console.log(item);
}
//结果:
//StudentInfo { name: 'Tom', score: 22 }
//StudentInfo { name: 'Jack', score: 88 }






网友评论