Skip to content

17-可迭代对象

可迭代(Iterable) 对象是数组的泛化。这个概念是说任何对象都可以被定制为可在 for..of 循环中使用的对象。

数组是可迭代的,但不仅限于数组,例如字符串也是可迭代的。

Symbol.iterator

假设我们有这样一个对象,它并不是数组,但是看上去很适合用 for...of...

js
let user = {
  name: 'John',
  sizes: {
    width: 180,
    height: 80,
  },
  school: undefined,
};

此时我们使用 for...of... 语法:

js
for (let item of user) {
  console.log(user);
}

会报错:

这说明对象并不天生是可迭代的,为了让它可迭代,我们需要为对象添加一个名为 Symbol.iterator方法

  1. for...of 循环启动时,它会调用这个方法。这个方法必须返回一个迭代器——一个有 next 方法的对象
  2. for...of 仅适用于这个被返回的对象。
  3. for...of 循环希望取得下一个数值,它就调用这个对象的 next 方法。
  4. next 方法返回的结果的格式必须是 {done: Boolean, value: any},当 done=true 时,表示循环结束,否则 value 是下一个值。
js
user[Symbol.iterator] = function () {
  // 获取对象的键值对
  const entries = Object.entries(this);
  let index = 0;

  return {
    // 实现 next 方法
    next() {
      if (index < entries.length) {
        const [key, value] = entries[index++];
        return { done: false, value: { key, value } };
      } else {
        return { done: true };
      }
    },
  };
};

字符串是可迭代的

#todo

参考