当我们用for..of来遍历普通对象时,就会报obj不可迭代的错,那么为啥呢?
要知道这个问题,首先我们了解下for..of时如何遍历出元素的。
for...of是通过Symbol.iterator迭代器实现遍历元素的
我们可以在浏览器上输出dir(Object)
发现对象原型上并没有这个迭代器函数,所以普通对象并不能用for...of遍历
而同时我们在看看Array原型上,显然可以看到这个方法
既然对象原型没有,我们可以自己加上去
Object.prototype[Symbol.iterator] = function iterator() {
let self = this,
keys = Reflect.ownKeys(self),//Reflect.ownKeys该方法可以拿到对象上的key值,包括Symbol定义的key值
index = 0;
return {
next() {
//index > keys.length - 1 时迭代结束
if (index > keys.length - 1) {
return {
done: true,
value: undefined,
};
}
return {
done: false,
value: self[keys[index++]], //输出的对象value值
};
},
};
};
//例如:
let obj = {
name: "123",
age: 12,
0: 122,
1: 200,
[Symbol("AA")]: 300,
};
//这时就可以啦
for (const value of obj) {
console.log(value);
}
//122、200、123、12、300