iterator接口 ...和for of依赖的关键

let arr = { 0: 1, 1: 2, 2: 3, length: 3 };
// arr[Symbol.iterator]=[][Symbol.iterator];
arr[Symbol.iterator] = function() {
    var tem = {
        index: 0,
    };
    //this指向的是arr
    var len = this.length;
    tem.next = function() {
        var r = {};
        //this指向tem,len形成了闭包
        //done是遍历器完成的标志物
        if (this.index < len) {
            r.value = arr[this.index++];
            r.done = false;
        } else {
            r.value = undefined,
                r.done = true;
        }
        return r;
    }
    return tem;
}
for (var i of arr) {
    console.log(i);
}

我们知道*函数依赖于next 调用碰到yield就返回 看一个例子
var obj={
    name:"jack",
    age:11,
    weight:120
}
obj[Symbol.iterator]=function* (){
    var me=this;
    var arr=Object.keys(me);
    for(var i=0;i<arr.length;i+=1){
        yield [arr[i],this[arr[i]]];
    }
}
for(var [k,v] of obj){
    console.log(k+":"+v);
}
是不是很不可思议 

 

 

posted on 2018-10-28 14:34  偏灬爱  阅读(121)  评论(0编辑  收藏  举报

导航