Iterator.from()

实验性: 这是一个 实验性技术
在生产环境中使用之前,请仔细查看 浏览器兼容性表

Iterator.from() 静态方法从迭代器或可迭代对象创建一个新的 Iterator 对象。

语法

js
from(object)

参数

object

实现 可迭代 协议或 迭代器 协议的对象。

返回值

如果 object 是可迭代的,则调用其 [Symbol.iterator]() 方法以获取迭代器。否则,假定 object 为迭代器。如果迭代器已经是 instanceof Iterator(这意味着其原型链中包含 Iterator.prototype),则直接返回它。否则,将创建一个新的 Iterator 对象,该对象包装原始迭代器。

描述

此方法用于将自定义迭代器(可能由库导出)转换为 正确的迭代器。由 Iterator.from() 返回的所有迭代器对象都继承自一个通用的原型对象,该对象具有以下方法

next()

调用底层迭代器的 next() 方法并返回结果。

return()

调用底层迭代器的 return() 方法并返回结果,或者如果底层迭代器没有 return() 方法,则返回 { value: undefined, done: true }

示例

将可迭代对象转换为正确的迭代器

因为 obj 已经是可迭代对象,当调用其 [Symbol.iterator]() 方法时会返回正确的迭代器,所以 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]() 方法时会返回非正确的迭代器,所以 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 }

将迭代器转换为正确的迭代器

因为 obj 已经是正确的迭代器,所以 Iterator.from(obj) 返回自身。

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

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

因为 obj2 是非正确的迭代器,所以 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 }

规范

规范
迭代器助手
# sec-iterator.from

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。

另请参阅