iterator接口 ...和for of依賴的關鍵
阿新 • • 發佈:2018-10-28
key one let div nbsp UNC this指向 value ret
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); }
是不是很不可思議
iterator接口 ...和for of依賴的關鍵