JavaScript Object.entries 的实现 及 iterator(迭代器)原理

Object.entries 的实现

const demo = {a: 1, b: 2}
const entries = (o = {}) => {
    const keys = Object.keys(o)
    return keys.map(v => [v, o[v]])
}

const result = entries(demo)

// 可被for...of循环 因为数组本身具有[Symbol.iterator]方法
for (const [k, v] of result) {
    console.log(k, v)
}

iterator 的实现

// 对象不可直接被for...of迭代 本身不具有[Symbol.iterator]方法

// 手动为对象添加[Symbol.iterator] 使得 对象也可以被for...of调用
const person = {
    value: [['id', 1], ['name', 'cxk']],
    [Symbol.iterator]() {
        const self = this
        let index = 0
        return {
            next() {
                const temp = {
                    value: self.value[index],
                    done: index >= self.value.length
                }
                index += 1
                return temp
            }
        }
    }
}

for (const [k, v] of person) {
    console.log(k, v)
}

使用 while 循环 模拟 for...of

const temp = {a: 1, b: 2}

const iterator = Object.entries(temp)[Symbol.iterator]()
let cur = iterator.next()
while (!cur.done) {
    console.log(cur.value)
    cur = iterator.next()
}
posted @ 2022-05-27 11:38  demo_you  阅读(111)  评论(0编辑  收藏  举报