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

浏览器兼容性

另见