コンテンツにスキップ

JavaScript/Symbol/iterator

出典: フリー教科書『ウィキブックス(Wikibooks)』


Symbol.iterator

[編集]

Symbol.iterator は、JavaScriptで反復可能オブジェクトを実装するために使用されるビルトインの Symbol です。オブジェクトが反復可能であるかを示し、反復子(Iterator)を返すメソッドを定義するために使用します。for...ofループ、スプレッド構文、Array.from() などの構文や関数で使用されます。

構文

[編集]

使用例

[編集]
const myIterable = {
  [Symbol.iterator]() {
    let count = 0;
    return {
      next() {
        if (count < 3) {
          return { value: count++, done: false };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
};

for (const value of myIterable) {
  console.log(value); // 0, 1, 2
}
  • [Symbol.iterator]() メソッドは反復可能オブジェクトにおいて必須です。
  • メソッドは反復子(Iterator)オブジェクトを返します。
  • 反復子オブジェクトは next() メソッドを持ち、{ value: 任意の値, done: 真偽値 } を返します。

反復可能オブジェクトの作成

[編集]

配列の例

[編集]

配列はデフォルトで Symbol.iterator を実装しています。

const array = [10, 20, 30];
const iterator = array[Symbol.iterator]();

console.log(iterator.next()); // { value: 10, done: false }
console.log(iterator.next()); // { value: 20, done: false }
console.log(iterator.next()); // { value: 30, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

カスタムオブジェクト

[編集]

独自の Symbol.iterator を実装してカスタム反復可能オブジェクトを作成できます。

const customIterable = {
  [Symbol.iterator]() {
    let count = 0;
    return {
      next() {
        if (count < 5) {
          return { value: count++, done: false };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
};

for (const value of customIterable) {
  console.log(value); // 0, 1, 2, 3, 4
}

スプレッド構文との使用

[編集]
const customIterable = {
  [Symbol.iterator]() {
    let count = 1;
    return {
      next() {
        if (count <= 3) {
          return { value: count++, done: false };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
};

const result = [...customIterable];
console.log(result); // [1, 2, 3]

スプレッド構文を使用すると、反復可能オブジェクトのすべての値を配列に展開できます。

特徴

[編集]
  • 標準反復可能オブジェクト: 配列、文字列、MapSet などのビルトインオブジェクトはデフォルトで Symbol.iterator を実装しています。
  • 柔軟性: カスタムオブジェクトに Symbol.iterator/code> を定義することで独自の反復処理が可能です。
  • 組み合わせ: for...of ループやスプレッド構文、Array.from() などで活用されます。

注意点

[編集]
  • Symbol.iterator はメソッド: 必ず関数として定義し、反復子オブジェクトを返さなければなりません。
  • 標準以外の実装: 標準ライブラリをカスタム実装で拡張する場合は、互換性に注意してください。

関連項目

[編集]

参考

[編集]