Iterator.from()

基準線 2025
新推出

自 ⁨2025 年 3 月⁩ 起,此功能可在最新的裝置和瀏覽器版本上使用。此功能可能在舊裝置或瀏覽器上無法正常工作。

Iterator.from() 靜態方法建立一個新的 Iterator 物件,該物件由一個迭代器或可迭代物件建立。

語法

js
from(object)

引數

object

實現了 iterable 協議或 iterator 協議的物件。

返回值

如果 object 是一個可迭代物件,則會呼叫其 [Symbol.iterator]() 方法來獲取迭代器。否則,object 被假定為一個迭代器。如果該迭代器已經是 instanceof Iterator(這意味著它在原型鏈中具有 Iterator.prototype),則直接返回該迭代器。否則,會建立一個新的 Iterator 物件來包裝原始迭代器。

描述

此方法用於將自定義迭代器(可能由庫匯出)轉換為 “proper” 迭代器。由 Iterator.from() 返回的所有迭代器物件都繼承自一個通用的原型物件,該物件具有以下方法:

next()

呼叫底層迭代器的 next() 方法並返回結果。

return()

呼叫底層迭代器的 return() 方法並返回結果,或者如果底層迭代器沒有 return() 方法,則返回 { value: undefined, done: true }

示例

將可迭代物件轉換為“proper”迭代器

由於 obj 已經是一個可迭代物件,在其 [Symbol.iterator]() 方法被呼叫時會返回一個“proper”迭代器,因此 Iterator.from(obj) 返回相同的迭代器。

js
const iterator = (function* () {
  yield 1;
  yield 2;
  yield 3;
})();

const obj = {
  [Symbol.iterator]() {
    return iterator;
  },
};

const iterator2 = Iterator.from(obj);
console.log(iterator2 === iterator); // true

由於 obj2 是一個可迭代物件,在其 [Symbol.iterator]() 方法被呼叫時會返回一個非“proper”迭代器,因此 Iterator.from(obj2) 返回一個包裝了原始迭代器的新迭代器。

js
const iterator = {
  current: 0,
  next() {
    return { value: this.current++, done: false };
  },
};

const obj2 = {
  [Symbol.iterator]() {
    return iterator;
  },
};

const iterator2 = Iterator.from(obj2);
console.log(iterator2 === iterator); // false
console.log(iterator2.next()); // { value: 0, done: false }
console.log(iterator.next()); // { value: 1, done: false }

將迭代器轉換為“proper”迭代器

由於 obj 已經是“proper”迭代器,因此 Iterator.from(obj) 返回自身。

js
const obj = (function* () {
  yield 1;
  yield 2;
  yield 3;
})();

const iterator = Iterator.from(obj);
console.log(iterator === obj); // true

由於 obj2 是一個非“proper”迭代器,因此 Iterator.from(obj2) 返回一個包裝了原始迭代器的新迭代器。

js
const obj2 = {
  current: 0,
  next() {
    return { value: this.current++, done: false };
  },
};

const iterator = Iterator.from(obj2);
console.log(iterator === obj2); // false
console.log(iterator.next()); // { value: 0, done: false }
console.log(obj2.next()); // { value: 1, done: false }

規範

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

瀏覽器相容性

另見