for of 如何支持对象

168 阅读1分钟

for of适用遍历数组对象,字符串,mapset等拥有迭代器对象(iterator)的集合,但是不能遍历对象,因为没有迭代器对象,但如果想遍历对象的属性,除了用for in循环()或Object.keys()方法之外,可以通过Symbol.iterator来创建迭代器对象。

如下所示:

let range = {
  from: 1,
  to: 5,
};

// 1. for..of 调用首先会调用这个:
range[Symbol.iterator] = function () {
  // ……它返回迭代器对象(iterator object):
  // 2. 接下来,for..of 仅与下面的迭代器对象一起工作,要求它提供下一个值
  return {
    current: this.from,
    last: this.to,

    // 3. next() 在 for..of 的每一轮循环迭代中被调用
    next() {
      // 4. 它将会返回 {done:.., value :...} 格式的对象
      if (this.current <= this.last) {
        return { done: false, value: this.current++ };
      } else {
        return { done: true };
      }
    },
  };
};

// 现在它可以运行了!
for (let num of range) {
  console.log(num); // 1, 然后是 2, 3, 4, 5
}