Skip to content

如何使对象 iterable 化, 使其可以支持 for...of 迭代

参考答案:

要使对象支持 for...of 迭代,你需要使该对象具有符合迭代协议的迭代器。实现这一点的方法是为对象定义一个名为 Symbol.iterator 的方法。这个方法应该返回一个迭代器对象,迭代器对象必须有一个 next 方法,该方法返回一个对象,其中包含 valuedone 属性。

以下是实现过程的步骤和示例代码:

1. 实现 Symbol.iterator 方法

1.1 定义迭代器对象

迭代器对象需要实现 next 方法,next 方法返回一个对象,包含两个属性:

  • value:当前的值。
  • done:一个布尔值,指示迭代是否完成。

1.2 在对象中实现 Symbol.iterator

Symbol.iterator 方法定义在对象上,这样对象就变成了可迭代的。

示例代码

示例 1: 基本对象

javascript
const myObject = {
  items: ['a', 'b', 'c'],
  [Symbol.iterator]() {
    let index = 0;
    const items = this.items;
    return {
      next() {
        if (index < items.length) {
          return { value: items[index++], done: false };
        } else {
          return { done: true };
        }
      }
    };
  }
};

// 使用 for...of 进行迭代
for (const item of myObject) {
  console.log(item); // 'a', 'b', 'c'
}

示例 2: 自定义对象

javascript
function createIterableObject() {
  return {
    start: 1,
    end: 5,
    [Symbol.iterator]() {
      let current = this.start;
      const end = this.end;
      return {
        next() {
          if (current <= end) {
            return { value: current++, done: false };
          } else {
            return { done: true };
          }
        }
      };
    }
  };
}

const iterableObject = createIterableObject();

// 使用 for...of 进行迭代
for (const num of iterableObject) {
  console.log(num); // 1, 2, 3, 4, 5
}

3. 注意事项

  • 生成器:生成器函数(function*)可以更方便地创建可迭代对象,它自动实现了 Symbol.iterator 方法,并简化了迭代器的代码。

示例 3: 使用生成器

javascript
function* range(start, end) {
  for (let i = start; i <= end; i++) {
    yield i;
  }
}

const iterableObject = range(1, 5);

// 使用 for...of 进行迭代
for (const num of iterableObject) {
  console.log(num); // 1, 2, 3, 4, 5
}

题目要点:

通过在对象中实现 Symbol.iterator 方法,可以使对象变得可迭代,从而支持 for...of 循环。Symbol.iterator 方法返回一个迭代器对象,该对象需要实现 next 方法,返回 { value, done } 结构。生成器函数是简化迭代器实现的一种便利方式。