Symbol.iterator

Baseline 已廣泛支援

此特性已非常成熟,可在多種裝置和瀏覽器版本上使用。自 ⁨2016 年 9 月⁩以來,它已在各大瀏覽器中可用。

Symbol.iterator 靜態資料屬性代表 Symbol.iterator 這個知名符號。該可迭代協議會查詢此符號,以獲取返回物件迭代器的那個方法。為了使物件可迭代,它必須有一個 [Symbol.iterator] 鍵。

試一試

const iterable = {};

iterable[Symbol.iterator] = function* () {
  yield 1;
  yield 2;
  yield 3;
};

console.log([...iterable]);
// Expected output: Array [1, 2, 3]

知名符號 Symbol.iterator

Symbol.iterator 的屬性特性
可寫
可列舉
可配置

描述

每當需要迭代一個物件時(例如在 for...of 迴圈開始時),都會呼叫其 [Symbol.iterator]() 方法(不帶引數),並使用返回的迭代器來獲取要迭代的值。

某些內建型別具有預設的迭代行為,而其他型別(例如 Object)則沒有。具有 [Symbol.iterator]() 方法的一些內建型別包括:

有關更多資訊,請參閱可迭代協議

示例

使用者自定義可迭代物件

我們可以這樣建立我們自己的可迭代物件:

js
const myIterable = {};
myIterable[Symbol.iterator] = function* () {
  yield 1;
  yield 2;
  yield 3;
};
[...myIterable]; // [1, 2, 3]

或者,可迭代物件可以直接使用計算屬性名在類或物件內部定義。

js
class Foo {
  *[Symbol.iterator]() {
    yield 1;
    yield 2;
    yield 3;
  }
}

const someObj = {
  *[Symbol.iterator]() {
    yield "a";
    yield "b";
  },
};

console.log(...new Foo()); // 1, 2, 3
console.log(...someObj); // 'a', 'b'

格式不正確的可迭代物件

如果可迭代物件的 [Symbol.iterator]() 方法沒有返回一個迭代器物件,那麼它就是一個格式不正確的可迭代物件。這樣使用它很可能會導致執行時異常或錯誤的行為。

js
const nonWellFormedIterable = {};
nonWellFormedIterable[Symbol.iterator] = () => 1;
[...nonWellFormedIterable]; // TypeError: [Symbol.iterator]() returned a non-object value

規範

規範
ECMAScript® 2026 語言規範
# sec-symbol.iterator

瀏覽器相容性

另見