Symbol.iterator
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]() 方法的一些內建型別包括:
Array.prototype[Symbol.iterator]()TypedArray.prototype[Symbol.iterator]()String.prototype[Symbol.iterator]()Map.prototype[Symbol.iterator]()Set.prototype[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 |
瀏覽器相容性
載入中…