每日一问,for..of为啥不能遍历普通对象?

113 阅读1分钟

当我们用for..of来遍历普通对象时,就会报obj不可迭代的错,那么为啥呢?

image.png

要知道这个问题,首先我们了解下for..of时如何遍历出元素的。 for...of是通过Symbol.iterator迭代器实现遍历元素的 我们可以在浏览器上输出dir(Object)

image.png

发现对象原型上并没有这个迭代器函数,所以普通对象并不能用for...of遍历

而同时我们在看看Array原型上,显然可以看到这个方法

image.png

既然对象原型没有,我们可以自己加上去

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