for…of 循環+iterator
//數組對象周遊,列印值
// const arr=[1,2,3,4]
// for(let i of arr){
// console.log(i);
// if(i>2){//可以随時終止循環,forEach就不能
// break;
// }
// }
//set對象周遊,列印值
// const s=new Set(arr)
// for(let i of s){
// console.log(i);
// }
//map對象周遊,列印數組形式的鍵值
// const m = new Map()
// m.set('m1', 1)
// m.set('m2', 2)
// for (let i of m) {
// console.log(i);
// }
// for (let [key,val] of m) {
// console.log(key,val);//自然可以解構後直接使用
// }
//普通對象周遊
// const obj={
// name:'xm',
// age:18
// }
// for(let i of obj){//obj is not iterable 需要實作可疊代接口
// }
// const set=new Set([1,2,3,4])
// const iterator=set[Symbol.iterator]()//擷取set對象中的iterator方法
// console.log(iterator.next());
// console.log(iterator.next());
// console.log(iterator.next());
// console.log(iterator.next());//通過next方法疊代set中的資料,這是for of中的工作原理
//重新嘗試通過for of周遊普通對象,首先要實作iterable接口
const obj = {
[Symbol.iterator]: function () {
let index = 0;
const keys=Object.entries(obj);
const _this = this;
return {
next: function () {
const result = {
//iterationResult
value: keys[index],
done: index>=keys.length
}
index++
return result
}
}
},
name: 'xm',
age: 18,
hobby:['eat','drink']
}
for (let i of obj) {//obj is not iterable 需要實作可疊代接口
console.log(i);
}