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);
}
是不是很不可思议