天天看点

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