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()
}
为之则易,不为则难。