天天看點

ES6學習-for...of 循環+iteratorfor…of 循環+iterator

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);
}