Iterator.from()

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

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 }

仕様書

Specification
Iterator Helpers
# sec-iterator.from

ブラウザーの互換性

BCD tables only load in the browser

関連情報