初級 免費 ⏱ 18:00

09-1 遍歷之理:反覆運算子 (Iterators)

探索 JavaScript 的迭代協議。理解 Symbol.iterator 如何讓物件變得可以被迴圈,並學習內建的 Iterable 物件。

IteratorsSymbolsProtocol

09-1 遍歷之理:反覆運算子 (Iterators)

👋 **老師的話 (Script)**: "你有沒有想過,為什麼 `Array` 可以用 `for...of`,但 `Object` 卻不行? 這背後有一套神祕的約定,叫做『迭代協議 (Iteration Protocol)』。

今天我們要學會如何讓任何東西(即使是一個複雜的資料結構)都變得可以被遍歷。 這會開啟你對『資料流』的新理解。“

1. 什麼是迭代器?

迭代器是一個物件,它有一個 next() 方法,回傳: { value: 任何值, done: 布林值 }

const myIterator = {
  i: 0,
  next() {
    if (this.i < 3) {
      return { value: this.i++, done: false };
    }
    return { done: true };
  }
};

console.log(myIterator.next()); // { value: 0, done: false }

2. Symbol.iterator:打通樞紐

要讓一個物件支援 for...of,你必須賦予它一個 [Symbol.iterator] 方法。

const collection = {
  items: ["A", "B"],
  [Symbol.iterator]() {
    let i = 0;
    return {
      next: () => {
        return i < this.items.length 
          ? { value: this.items[i++], done: false } 
          : { done: true };
      }
    };
  }
};

for (const x of collection) {
  console.log(x); // "A", "B"
}

3. Iterable 的力量

只要一個物件是 Iterable (可迭代的),你就可以對它使用:

  • for...of
  • [...spread] (展開運算子)
  • Array.from()
🧪 Lab 19: 自定義遞減計時器 請建立一個物件 countdown,讓它支援 for...of。 當你使用迴圈時,它會從 10 倒數到 1 然後停止。

🚀 下一節課預告 寫迭代器有點麻煩對吧?要自己寫 next()... 下一節,我們要學習一個超級語法糖:產生器 (Generators)。 使用 *yield,你就能優雅地控制代碼的執行順序。