ES6迭代器学习笔记

2017-12-06  本文已影响8人  拾起落叶好过冬

es6中,加上新增的集合对象已经有了4种(Object,Array,Set,Map),Iterator迭代器是提供遍历的统一接口,也可理解为指针。

如果某种数据结构实现了Iterator接口,就可以确定是可遍历的。

原生具有Iterator接口的数据结构有:

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 }

上一篇 下一篇

猜你喜欢

热点阅读