<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>http://mochiuwiki.e2.valueserver.jp/index.php?action=history&amp;feed=atom&amp;title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%A8%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF</id>
	<title>JavaScriptの基礎 - イテレータとジェネレータ - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="http://mochiuwiki.e2.valueserver.jp/index.php?action=history&amp;feed=atom&amp;title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%A8%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF"/>
	<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%A8%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF&amp;action=history"/>
	<updated>2026-08-20T09:39:47Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%A8%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF&amp;diff=14355&amp;oldid=prev</id>
		<title>Wiki: ページの作成:「== 概要 == イテレータ (Iterator) は、シーケンスを定義するための統一的なインターフェースである。&lt;br&gt; &lt;code&gt;next()&lt;/code&gt; メソッドを持つオブジェクトであり、呼び出すたびに &lt;code&gt;{ value, done }&lt;/code&gt; 形式のオブジェクトを返す。&lt;br&gt; &lt;br&gt; イテラブル (Iterable) は &lt;code&gt;Symbol.iterator&lt;/code&gt; メソッドを持つオブジェクトであり、このメソッドがイテレータを返す。&lt;b…」</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=JavaScript%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%A8%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF&amp;diff=14355&amp;oldid=prev"/>
		<updated>2026-02-19T17:40:30Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「== 概要 == イテレータ (Iterator) は、シーケンスを定義するための統一的なインターフェースである。&amp;lt;br&amp;gt; &amp;lt;code&amp;gt;next()&amp;lt;/code&amp;gt; メソッドを持つオブジェクトであり、呼び出すたびに &amp;lt;code&amp;gt;{ value, done }&amp;lt;/code&amp;gt; 形式のオブジェクトを返す。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; イテラブル (Iterable) は &amp;lt;code&amp;gt;Symbol.iterator&amp;lt;/code&amp;gt; メソッドを持つオブジェクトであり、このメソッドがイテレータを返す。&amp;lt;b…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 概要 ==&lt;br /&gt;
イテレータ (Iterator) は、シーケンスを定義するための統一的なインターフェースである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;next()&amp;lt;/code&amp;gt; メソッドを持つオブジェクトであり、呼び出すたびに &amp;lt;code&amp;gt;{ value, done }&amp;lt;/code&amp;gt; 形式のオブジェクトを返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
イテラブル (Iterable) は &amp;lt;code&amp;gt;Symbol.iterator&amp;lt;/code&amp;gt; メソッドを持つオブジェクトであり、このメソッドがイテレータを返す。&amp;lt;br&amp;gt;&lt;br /&gt;
配列、文字列、Map、Set 等の組み込みオブジェクトはイテラブルとして実装されており、&amp;lt;code&amp;gt;for...of&amp;lt;/code&amp;gt; 文やスプレッド構文等で利用できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ジェネレータ関数 (&amp;lt;code&amp;gt;function*&amp;lt;/code&amp;gt;) は、イテレータを簡潔に作成するための特殊な関数である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;lt;code&amp;gt;yield&amp;lt;/code&amp;gt; キーワードで実行を一時停止して値を返し、次の呼び出しで再開するという動作を実現する。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ジェネレータが返すオブジェクトはイテレータかつイテラブルであるため、&amp;lt;code&amp;gt;for...of&amp;lt;/code&amp;gt; 文等でそのまま利用できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ES2025では Iterator Helpers が標準化され、&amp;lt;code&amp;gt;Iterator.prototype&amp;lt;/code&amp;gt; に &amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;take&amp;lt;/code&amp;gt; 等のメソッドが追加された。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
これらのメソッドは遅延評価 (Lazy Evaluation) によって動作するため、中間配列を生成せずにメモリ効率の良いパイプライン処理を記述できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== イテレータプロトコル ==&lt;br /&gt;
JavaScriptのイテレータは、イテレータプロトコルとイテラブルプロトコルの2つのプロトコルで定義される。&amp;lt;br&amp;gt;&lt;br /&gt;
これらのプロトコルを実装することで、独自のオブジェクトを &amp;lt;code&amp;gt;for...of&amp;lt;/code&amp;gt; やスプレッド構文と組み合わせて使用できるようになる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== イテレータとは ====&lt;br /&gt;
イテレータは &amp;lt;code&amp;gt;next()&amp;lt;/code&amp;gt; メソッドを持つオブジェクトである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;next()&amp;lt;/code&amp;gt; を呼び出すと、以下の2つのプロパティを持つオブジェクトを返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&lt;br /&gt;
*: 現在の要素の値。&lt;br /&gt;
*: code&amp;gt;done&amp;lt;/code&amp;gt; が &amp;lt;u&amp;gt;true&amp;lt;/u&amp;gt; の場合は、一般的に &amp;lt;u&amp;gt;undefined&amp;lt;/u&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt;&lt;br /&gt;
*: 反復が完了したかどうかを示す真偽値&lt;br /&gt;
*: 完了していれば &amp;lt;u&amp;gt;true&amp;lt;/u&amp;gt;、続きがあれば &amp;lt;u&amp;gt;false&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
カスタムイテレータの作成例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // カスタムイテレータの作成&lt;br /&gt;
 function createRangeIterator(start, end) {&lt;br /&gt;
    let current = start;&lt;br /&gt;
    return {&lt;br /&gt;
       next() {&lt;br /&gt;
          if (current &amp;lt;= end) {&lt;br /&gt;
             return { value: current++, done: false };&lt;br /&gt;
          }&lt;br /&gt;
          return { value: undefined, done: true };&lt;br /&gt;
       }&lt;br /&gt;
    };&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 const iter = createRangeIterator(1, 3);&lt;br /&gt;
 console.log(iter.next());  // { value: 1, done: false }&lt;br /&gt;
 console.log(iter.next());  // { value: 2, done: false }&lt;br /&gt;
 console.log(iter.next());  // { value: 3, done: false }&lt;br /&gt;
 console.log(iter.next());  // { value: undefined, done: true }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== イテラブルプロトコル ====&lt;br /&gt;
イテラブルは &amp;lt;code&amp;gt;Symbol.iterator&amp;lt;/code&amp;gt; メソッドを持つオブジェクトである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Symbol.iterator&amp;lt;/code&amp;gt; を呼び出すとイテレータオブジェクトを返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
カスタムイテラブルの作成例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // カスタムイテラブルの作成&lt;br /&gt;
 const range = {&lt;br /&gt;
    from: 1,&lt;br /&gt;
    to: 5,&lt;br /&gt;
    [Symbol.iterator]() {&lt;br /&gt;
       let current = this.from;&lt;br /&gt;
       const last = this.to;&lt;br /&gt;
       return {&lt;br /&gt;
          next() {&lt;br /&gt;
             if (current &amp;lt;= last) {&lt;br /&gt;
                return { value: current++, done: false };&lt;br /&gt;
             }&lt;br /&gt;
             return { value: undefined, done: true };&lt;br /&gt;
          }&lt;br /&gt;
       };&lt;br /&gt;
    }&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 // for...ofで使用できる&lt;br /&gt;
 for (const num of range) {&lt;br /&gt;
    console.log(num);  // 1, 2, 3, 4, 5&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // スプレッド構文でも使用できる&lt;br /&gt;
 console.log([...range]);  // [1, 2, 3, 4, 5]&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 組み込みイテラブル ====&lt;br /&gt;
JavaScriptには、最初からイテラブルプロトコルを実装している組み込みオブジェクトが多数存在する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 組み込みイテラブル一覧&lt;br /&gt;
! 型 !! イテレートされる値 !! 備考&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Array&amp;lt;/code&amp;gt; || 各要素の値 || 最も基本的なイテラブル&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt; || 各文字 (Unicode コードポイント単位) || サロゲートペアを正しく扱う&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Map&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;[key, value]&amp;lt;/code&amp;gt; のペア || 挿入順で反復&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Set&amp;lt;/code&amp;gt; || 各要素の値 || 挿入順で反復、重複なし&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TypedArray&amp;lt;/code&amp;gt; || 各要素の値 || &amp;lt;code&amp;gt;Int32Array&amp;lt;/code&amp;gt; 等の型付き配列&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;arguments&amp;lt;/code&amp;gt; || 各引数の値 || 関数内の暗黙の引数オブジェクト&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NodeList&amp;lt;/code&amp;gt; || 各DOMノード || &amp;lt;code&amp;gt;querySelectorAll&amp;lt;/code&amp;gt; の戻り値等&lt;br /&gt;
|-&lt;br /&gt;
| ジェネレータオブジェクト || &amp;lt;code&amp;gt;yield&amp;lt;/code&amp;gt; した値 || &amp;lt;code&amp;gt;function*&amp;lt;/code&amp;gt; の戻り値&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== for...of とイテレータ ==&lt;br /&gt;
&amp;lt;code&amp;gt;for...of&amp;lt;/code&amp;gt; 文はイテラブルプロトコルに基づいて動作する反復構文である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== for...of の動作原理 ====&lt;br /&gt;
&amp;lt;code&amp;gt;for...of&amp;lt;/code&amp;gt; は内部的に以下の手順で動作する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
# 対象オブジェクトの &amp;lt;code&amp;gt;Symbol.iterator&amp;lt;/code&amp;gt; メソッドを呼び出してイテレータを取得する。&lt;br /&gt;
# イテレータの &amp;lt;code&amp;gt;next()&amp;lt;/code&amp;gt; メソッドを繰り返し呼び出す。&lt;br /&gt;
# &amp;lt;code&amp;gt;next()&amp;lt;/code&amp;gt; の戻り値の &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; が &amp;lt;u&amp;gt;true&amp;lt;/u&amp;gt; になるまで、&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; を変数に代入してループ本体を実行する。&lt;br /&gt;
# &amp;lt;code&amp;gt;done&amp;lt;/code&amp;gt; が &amp;lt;u&amp;gt;true&amp;lt;/u&amp;gt; になるとループを終了する。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // for...of の基本的な使い方&lt;br /&gt;
 const arr = [10, 20, 30];&lt;br /&gt;
 for (const value of arr) {&lt;br /&gt;
    console.log(value);  // 10, 20, 30&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 内部動作を明示的に再現した例&lt;br /&gt;
 const iterator = arr[Symbol.iterator]();&lt;br /&gt;
 let result = iterator.next();&lt;br /&gt;
 while (!result.done) {&lt;br /&gt;
    console.log(result.value);  // 10, 20, 30&lt;br /&gt;
    result = iterator.next();&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== for...of が使用できる場面 ====&lt;br /&gt;
イテラブルを消費できる構文・関数を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ イテラブルを消費する主な構文・API&lt;br /&gt;
! 構文・API !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;for...of&amp;lt;/code&amp;gt; 文 || 最も基本的なイテレータ消費構文&lt;br /&gt;
|-&lt;br /&gt;
| スプレッド構文 (&amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;) || &amp;lt;code&amp;gt;[...iterable]&amp;lt;/code&amp;gt; のように配列に展開する。&lt;br /&gt;
|-&lt;br /&gt;
| 分割代入 || &amp;lt;code&amp;gt;const [a, b] = iterable&amp;lt;/code&amp;gt; のように変数に展開する。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Array.from()&amp;lt;/code&amp;gt; || イテラブルを配列に変換する。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Map&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Set&amp;lt;/code&amp;gt; コンストラクタ || &amp;lt;code&amp;gt;new Map(iterable)&amp;lt;/code&amp;gt; のようにコレクションを初期化する。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Promise.all()&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Promise.race()&amp;lt;/code&amp;gt; || イテラブルのPromiseをまとめて処理する。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;yield*&amp;lt;/code&amp;gt; || ジェネレータ内で別のイテラブルに処理を委譲する。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== for...of と for...in の違い ====&lt;br /&gt;
&amp;lt;code&amp;gt;for...of&amp;lt;/code&amp;gt; と &amp;lt;code&amp;gt;for...in&amp;lt;/code&amp;gt; は見た目が似ているが、用途が大きく異なる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ for...of と for...in の比較&lt;br /&gt;
! 項目 !! for...of !! for...in&lt;br /&gt;
|-&lt;br /&gt;
| 対象 || イテラブルオブジェクト || すべてのオブジェクト&lt;br /&gt;
|-&lt;br /&gt;
| 返す値 || 要素の値 || プロパティ名 (文字列)&lt;br /&gt;
|-&lt;br /&gt;
| プロトタイプチェーン || 辿らない || 列挙可能なプロパティを辿る&lt;br /&gt;
|-&lt;br /&gt;
| 配列での挙動 || 要素の値を返す || インデックスを文字列で返す&lt;br /&gt;
|-&lt;br /&gt;
| 主な用途 || イテラブルの値を処理する || オブジェクトのプロパティを列挙する&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 const arr = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
 // for...of : 要素の値を反復&lt;br /&gt;
 for (const value of arr) {&lt;br /&gt;
    console.log(value);  // &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // for...in : インデックスを文字列で反復&lt;br /&gt;
 for (const key in arr) {&lt;br /&gt;
    console.log(key);    // &amp;quot;0&amp;quot;, &amp;quot;1&amp;quot;, &amp;quot;2&amp;quot; (文字列)&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // for...inはプロトタイプチェーンも辿る (注意)&lt;br /&gt;
 const obj = { a: 1, b: 2 };&lt;br /&gt;
 Object.prototype.extra = 99;  // プロトタイプにプロパティを追加&lt;br /&gt;
 for (const key in obj) {&lt;br /&gt;
    console.log(key);  // &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;extra&amp;quot; (意図しない結果)&lt;br /&gt;
 }&lt;br /&gt;
 // hasOwnPropertyでフィルタリングする&lt;br /&gt;
 for (const key in obj) {&lt;br /&gt;
    if (Object.hasOwn(obj, key)) {&lt;br /&gt;
       console.log(key);  // &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 delete Object.prototype.extra;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== スプレッド構文と分割代入との関係 ==&lt;br /&gt;
スプレッド構文と分割代入は、どちらもイテラブルプロトコルに依存している。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
配列に限らず、&amp;lt;code&amp;gt;Symbol.iterator&amp;lt;/code&amp;gt; を実装したあらゆるオブジェクトに対してこれらの構文を使用できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // カスタムイテラブルに対するスプレッド構文&lt;br /&gt;
 const range = {&lt;br /&gt;
    [Symbol.iterator]() {&lt;br /&gt;
       let i = 1;&lt;br /&gt;
       return { next: () =&amp;gt; i &amp;lt;= 3 ? { value: i++, done: false } : { done: true } };&lt;br /&gt;
    }&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 console.log([...range]);           // [1, 2, 3]&lt;br /&gt;
 const [first, second] = range;&lt;br /&gt;
 console.log(first, second);        // 1 2&lt;br /&gt;
 &lt;br /&gt;
 // Mapのスプレッド (エントリのペアが展開される)&lt;br /&gt;
 const map = new Map([[&amp;quot;a&amp;quot;, 1], [&amp;quot;b&amp;quot;, 2]]);&lt;br /&gt;
 console.log([...map]);             // [[&amp;quot;a&amp;quot;, 1], [&amp;quot;b&amp;quot;, 2]]&lt;br /&gt;
 &lt;br /&gt;
 const [[k1, v1], [k2, v2]] = map;&lt;br /&gt;
 console.log(k1, v1, k2, v2);       // &amp;quot;a&amp;quot; 1 &amp;quot;b&amp;quot; 2&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ジェネレータ関数 ==&lt;br /&gt;
ジェネレータ関数は、イテレータを簡潔に定義するための特殊な関数である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;function*&amp;lt;/code&amp;gt; 構文で宣言し、&amp;lt;code&amp;gt;yield&amp;lt;/code&amp;gt; キーワードで値を返しながら実行を一時停止する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 基本構文 ====&lt;br /&gt;
ジェネレータ関数を呼び出すと、関数本体はすぐに実行されず、ジェネレータオブジェクトが返される。&amp;lt;br&amp;gt;&lt;br /&gt;
ジェネレータオブジェクトはイテレータかつイテラブルである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // ジェネレータ関数の宣言&lt;br /&gt;
 function* simpleGenerator() {&lt;br /&gt;
    yield 1;&lt;br /&gt;
    yield 2;&lt;br /&gt;
    yield 3;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 const gen = simpleGenerator();  // ジェネレータオブジェクトを取得&lt;br /&gt;
 &lt;br /&gt;
 // イテレータとして使用&lt;br /&gt;
 console.log(gen.next());        // { value: 1, done: false }&lt;br /&gt;
 console.log(gen.next());        // { value: 2, done: false }&lt;br /&gt;
 console.log(gen.next());        // { value: 3, done: false }&lt;br /&gt;
 console.log(gen.next());        // { value: undefined, done: true }&lt;br /&gt;
 &lt;br /&gt;
 // イテラブルとして使用 (for...of, スプレッド構文等)&lt;br /&gt;
 for (const value of simpleGenerator()) {&lt;br /&gt;
    console.log(value);          // 1, 2, 3&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 console.log([...simpleGenerator()]);  // [1, 2, 3]&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== yieldの動作 ====&lt;br /&gt;
&amp;lt;code&amp;gt;yield&amp;lt;/code&amp;gt; は関数の実行を一時停止して、指定した値を呼び出し元に返す。&amp;lt;br&amp;gt;&lt;br /&gt;
次に、&amp;lt;code&amp;gt;next()&amp;lt;/code&amp;gt; が呼び出されると、&amp;lt;code&amp;gt;yield&amp;lt;/code&amp;gt; の直後から実行が再開される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 function* stepGenerator() {&lt;br /&gt;
    console.log(&amp;quot;ステップ1開始&amp;quot;);&lt;br /&gt;
    yield &amp;quot;step1&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    console.log(&amp;quot;ステップ2開始&amp;quot;);&lt;br /&gt;
    yield &amp;quot;step2&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    console.log(&amp;quot;完了&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 const gen = stepGenerator();&lt;br /&gt;
 &lt;br /&gt;
 console.log(gen.next());&lt;br /&gt;
 // &amp;quot;ステップ1開始&amp;quot; が出力される&lt;br /&gt;
 // { value: &amp;quot;step1&amp;quot;, done: false } が返る&lt;br /&gt;
 &lt;br /&gt;
 console.log(gen.next());&lt;br /&gt;
 // &amp;quot;ステップ2開始&amp;quot; が出力される&lt;br /&gt;
 // { value: &amp;quot;step2&amp;quot;, done: false } が返る&lt;br /&gt;
 &lt;br /&gt;
 console.log(gen.next());&lt;br /&gt;
 // &amp;quot;完了&amp;quot; が出力される&lt;br /&gt;
 // { value: undefined, done: true } が返る&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== next() による値の送信 ====&lt;br /&gt;
&amp;lt;code&amp;gt;next(value)&amp;lt;/code&amp;gt; の引数として値を渡すことで、ジェネレータ内の &amp;lt;code&amp;gt;yield&amp;lt;/code&amp;gt; 式の評価結果として値を受け取ることができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
最初の &amp;lt;code&amp;gt;next()&amp;lt;/code&amp;gt; 呼び出しに渡した値は無視される。&amp;lt;br&amp;gt;&lt;br /&gt;
これは、最初の &amp;lt;code&amp;gt;next()&amp;lt;/code&amp;gt; が実行を開始するまでの間、対応する &amp;lt;code&amp;gt;yield&amp;lt;/code&amp;gt; 式がまだ存在しないためである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 function* accumulator() {&lt;br /&gt;
    let total = 0;&lt;br /&gt;
    while (true) {&lt;br /&gt;
       // yield 式の値が next() の引数として渡される&lt;br /&gt;
       const input = yield total;&lt;br /&gt;
       if (input === null) break;&lt;br /&gt;
       total += input;&lt;br /&gt;
    }&lt;br /&gt;
    return total;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 const gen = accumulator();&lt;br /&gt;
 console.log(gen.next());      // { value: 0, done: false } (最初の呼び出し、引数は無視)&lt;br /&gt;
 console.log(gen.next(10));    // { value: 10, done: false }&lt;br /&gt;
 console.log(gen.next(20));    // { value: 30, done: false }&lt;br /&gt;
 console.log(gen.next(5));     // { value: 35, done: false }&lt;br /&gt;
 console.log(gen.next(null));  // { value: 35, done: true } (break でジェネレータ終了)&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== return と throw ====&lt;br /&gt;
ジェネレータオブジェクトには、&amp;lt;code&amp;gt;next()&amp;lt;/code&amp;gt; の他に &amp;lt;code&amp;gt;return()&amp;lt;/code&amp;gt; と &amp;lt;code&amp;gt;throw()&amp;lt;/code&amp;gt; メソッドがある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 各メソッドの動作&lt;br /&gt;
! メソッド !! 動作&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;return(value)&amp;lt;/code&amp;gt; || ジェネレータを強制的に終了する。&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;{ value: value, done: true }&amp;lt;/code&amp;gt; を返す。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;throw(error)&amp;lt;/code&amp;gt; || ジェネレータ内で例外を発生させる。&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;try...catch&amp;lt;/code&amp;gt; で捕捉できる。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 function* withCleanup() {&lt;br /&gt;
    try {&lt;br /&gt;
       yield 1;&lt;br /&gt;
       yield 2;&lt;br /&gt;
       yield 3;&lt;br /&gt;
    }&lt;br /&gt;
    finally {&lt;br /&gt;
       // return() や throw() が呼ばれてもここは必ず実行される&lt;br /&gt;
       console.log(&amp;quot;クリーンアップ処理&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // return() の使用例&lt;br /&gt;
 const gen1 = withCleanup();&lt;br /&gt;
 console.log(gen1.next());         // { value: 1, done: false }&lt;br /&gt;
 console.log(gen1.return(&amp;quot;終了&amp;quot;)); // &amp;quot;クリーンアップ処理&amp;quot; が出力される&lt;br /&gt;
                                   // { value: &amp;quot;終了&amp;quot;, done: true }&lt;br /&gt;
 &lt;br /&gt;
 // throw() の使用例&lt;br /&gt;
 function* withErrorHandling() {&lt;br /&gt;
    try {&lt;br /&gt;
       yield 1;&lt;br /&gt;
       yield 2;&lt;br /&gt;
    }&lt;br /&gt;
    catch (e) {&lt;br /&gt;
       console.log(&amp;quot;エラーをキャッチ:&amp;quot;, e.message);&lt;br /&gt;
       yield &amp;quot;エラー後の値&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 const gen2 = withErrorHandling();&lt;br /&gt;
 console.log(gen2.next());                         // { value: 1, done: false }&lt;br /&gt;
 console.log(gen2.throw(new Error(&amp;quot;テストエラー&amp;quot;)));&lt;br /&gt;
 // &amp;quot;エラーをキャッチ: テストエラー&amp;quot; が出力される&lt;br /&gt;
 // { value: &amp;quot;エラー後の値&amp;quot;, done: false }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== yield* (委譲) ====&lt;br /&gt;
&amp;lt;code&amp;gt;yield*&amp;lt;/code&amp;gt; は別のイテラブルまたはジェネレータに処理を委譲する構文である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
委譲されたイテラブルの全要素を &amp;lt;code&amp;gt;yield&amp;lt;/code&amp;gt; した後、&amp;lt;code&amp;gt;yield*&amp;lt;/code&amp;gt; 式自体の評価結果として、&amp;lt;br&amp;gt;&lt;br /&gt;
委譲先ジェネレータのreturn値 (最後の &amp;lt;u&amp;gt;done: true&amp;lt;/u&amp;gt; の &amp;lt;u&amp;gt;value&amp;lt;/u&amp;gt;) が得られる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 function* inner() {&lt;br /&gt;
    yield &amp;quot;a&amp;quot;;&lt;br /&gt;
    yield &amp;quot;b&amp;quot;;&lt;br /&gt;
    return &amp;quot;innerの戻り値&amp;quot;;  // done: true の value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function* outer() {&lt;br /&gt;
    yield 1;&lt;br /&gt;
    const result = yield* inner();  // inner の要素を委譲し、return 値を受け取る&lt;br /&gt;
    console.log(&amp;quot;inner の戻り値:&amp;quot;, result);  // &amp;quot;inner の戻り値: inner の戻り値&amp;quot;&lt;br /&gt;
    yield 2;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 console.log([...outer()]);  // [1, &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2]&lt;br /&gt;
 // &amp;quot;inner の戻り値: inner の戻り値&amp;quot;も出力される&lt;br /&gt;
 &lt;br /&gt;
 // yield* は通常のイテラブルにも使用できる&lt;br /&gt;
 function* flatten(arr) {&lt;br /&gt;
    for (const item of arr) {&lt;br /&gt;
       if (Array.isArray(item)) {&lt;br /&gt;
          yield* flatten(item);  // 再帰的に委譲&lt;br /&gt;
       } else {&lt;br /&gt;
          yield item;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 console.log([...flatten([1, [2, [3, 4]], 5])]);  // [1, 2, 3, 4, 5]&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== サンプルコード ====&lt;br /&gt;
===== 無限シーケンス =====&lt;br /&gt;
ジェネレータは遅延評価により無限シーケンスを表現できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;for...of&amp;lt;/code&amp;gt; の &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt; や &amp;lt;code&amp;gt;take()&amp;lt;/code&amp;gt; 等で必要な分だけ取り出して使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // フィボナッチ数列 (無限シーケンス)&lt;br /&gt;
 function* fibonacci() {&lt;br /&gt;
    let a = 0, b = 1;&lt;br /&gt;
    while (true) {&lt;br /&gt;
       yield a;&lt;br /&gt;
       [a, b] = [b, a + b];&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 先頭10個を取り出す&lt;br /&gt;
 const fib = fibonacci();&lt;br /&gt;
 const first10 = [];&lt;br /&gt;
 for (let i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
    first10.push(fib.next().value);&lt;br /&gt;
 }&lt;br /&gt;
 console.log(first10);  // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]&lt;br /&gt;
 &lt;br /&gt;
 // IDジェネレータ&lt;br /&gt;
 function* idGenerator(prefix = &amp;quot;id&amp;quot;) {&lt;br /&gt;
    let id = 1;&lt;br /&gt;
    while (true) {&lt;br /&gt;
       yield `${prefix}-${id++}`;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 const gen = idGenerator(&amp;quot;user&amp;quot;);&lt;br /&gt;
 console.log(gen.next().value);   // &amp;quot;user-1&amp;quot;&lt;br /&gt;
 console.log(gen.next().value);   // &amp;quot;user-2&amp;quot;&lt;br /&gt;
 console.log(gen.next().value);   // &amp;quot;user-3&amp;quot;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== 遅延評価 =====&lt;br /&gt;
ジェネレータは必要になるまで次の値を計算しない遅延評価により、大量データをメモリ効率良く処理できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // 大量のデータを逐次処理する例&lt;br /&gt;
 function* readLines(text) {&lt;br /&gt;
    const lines = text.split(&amp;quot;\n&amp;quot;);&lt;br /&gt;
    for (const line of lines) {&lt;br /&gt;
       yield line.trim();&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function* filterNonEmpty(iterable) {&lt;br /&gt;
    for (const item of iterable) {&lt;br /&gt;
       if (item.length &amp;gt; 0) yield item;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function* parseCSV(lines) {&lt;br /&gt;
    for (const line of lines) {&lt;br /&gt;
       yield line.split(&amp;quot;,&amp;quot;).map(s =&amp;gt; s.trim());&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 const csvData = `&lt;br /&gt;
 Alice, 30, Tokyo&lt;br /&gt;
 Bob, 25, Osaka&lt;br /&gt;
 &lt;br /&gt;
 Charlie, 35, Kyoto&lt;br /&gt;
 `.trim();&lt;br /&gt;
 &lt;br /&gt;
 // パイプライン : 各段階で必要な分だけ処理する&lt;br /&gt;
 const pipeline = parseCSV(filterNonEmpty(readLines(csvData)));&lt;br /&gt;
 for (const row of pipeline) {&lt;br /&gt;
    console.log(row);  // [&amp;quot;Alice&amp;quot;, &amp;quot;30&amp;quot;, &amp;quot;Tokyo&amp;quot;], [&amp;quot;Bob&amp;quot;, &amp;quot;25&amp;quot;, &amp;quot;Osaka&amp;quot;], ...&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== イテレータヘルパー (ES2025) ==&lt;br /&gt;
ES2025でイテレータヘルパーが標準化され、&amp;lt;code&amp;gt;Iterator.prototype&amp;lt;/code&amp;gt; に配列の反復メソッドに相当するメソッド群が追加された。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 概要 ====&lt;br /&gt;
イテレータヘルパーは &amp;lt;code&amp;gt;Iterator.prototype&amp;lt;/code&amp;gt; に追加されたメソッド群であり、全ての最新のWebブラウザ (Chrome 122+、Firefox 131+、Safari 18.2+) で利用できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
配列の &amp;lt;code&amp;gt;map()&amp;lt;/code&amp;gt; や &amp;lt;code&amp;gt;filter()&amp;lt;/code&amp;gt; と異なり、イテレータヘルパーは遅延評価で動作する。&amp;lt;br&amp;gt;&lt;br /&gt;
メソッドチェーンを組んでも中間配列を生成しないため、大量データや無限シーケンスを効率的に処理できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== map ====&lt;br /&gt;
&amp;lt;code&amp;gt;Iterator.prototype.map(fn)&amp;lt;/code&amp;gt; は各要素にマッピング関数を適用した新しいイテレータを返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 function* naturals() {&lt;br /&gt;
    let i = 1;&lt;br /&gt;
    while (true) yield i++;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 各要素を2倍にするイテレータ (遅延評価)&lt;br /&gt;
 const doubled = naturals().map(n =&amp;gt; n * 2);&lt;br /&gt;
 console.log(doubled.next());  // { value: 2, done: false }&lt;br /&gt;
 console.log(doubled.next());  // { value: 4, done: false }&lt;br /&gt;
 console.log(doubled.next());  // { value: 6, done: false }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== filter ====&lt;br /&gt;
&amp;lt;code&amp;gt;Iterator.prototype.filter(fn)&amp;lt;/code&amp;gt; はフィルタ関数が &amp;lt;u&amp;gt;true&amp;lt;/u&amp;gt; を返す要素のみを含む新しいイテレータを返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 function* naturals() { let i = 1; while (true) yield i++; }&lt;br /&gt;
 &lt;br /&gt;
 // 偶数のみを通すイテレータ (遅延評価)&lt;br /&gt;
 const evens = naturals().filter(n =&amp;gt; n % 2 === 0);&lt;br /&gt;
 console.log(evens.next());  // { value: 2, done: false }&lt;br /&gt;
 console.log(evens.next());  // { value: 4, done: false }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== take ====&lt;br /&gt;
&amp;lt;code&amp;gt;Iterator.prototype.take(n)&amp;lt;/code&amp;gt; は、先頭 &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; 個の要素を返した後に完了するイテレータを返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 function* naturals() { let i = 1; while (true) yield i++; }&lt;br /&gt;
 &lt;br /&gt;
 // 先頭5個だけを取り出す&lt;br /&gt;
 console.log([...naturals().take(5)]);  // [1, 2, 3, 4, 5]&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== drop ====&lt;br /&gt;
&amp;lt;code&amp;gt;Iterator.prototype.drop(n)&amp;lt;/code&amp;gt; は、先頭 &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; 個をスキップした残りの要素を返すイテレータを返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 function* naturals() { let i = 1; while (true) yield i++; }&lt;br /&gt;
 &lt;br /&gt;
 // 先頭5個をスキップして次の3個を取得&lt;br /&gt;
 console.log([...naturals().drop(5).take(3)]);  // [6, 7, 8]&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== reduce ====&lt;br /&gt;
&amp;lt;code&amp;gt;Iterator.prototype.reduce(fn, initial)&amp;lt;/code&amp;gt; は、全ての要素を集約した値を返す即時評価メソッドである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // 1から10の合計&lt;br /&gt;
 function* range(start, end) {&lt;br /&gt;
    for (let i = start; i &amp;lt;= end; i++) yield i;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 const sum = range(1, 10).reduce((acc, n) =&amp;gt; acc + n, 0);&lt;br /&gt;
 console.log(sum);  // 55&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== toArray ====&lt;br /&gt;
&amp;lt;code&amp;gt;Iterator.prototype.toArray()&amp;lt;/code&amp;gt; は、イテレータの全ての要素を配列に変換する即時評価メソッドである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 function* range(start, end) {&lt;br /&gt;
    for (let i = start; i &amp;lt;= end; i++) yield i;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 const arr = range(1, 5).toArray();&lt;br /&gt;
 console.log(arr);  // [1, 2, 3, 4, 5]&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== メソッドチェーン ====&lt;br /&gt;
イテレータヘルパーのメソッドを連鎖させることで、宣言的で読みやすいパイプライン処理を記述できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
遅延評価により、&amp;lt;code&amp;gt;toArray()&amp;lt;/code&amp;gt; や &amp;lt;code&amp;gt;reduce()&amp;lt;/code&amp;gt; 等の即時評価メソッドが呼ばれるまで要素は消費されない。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 function* naturals() { let i = 1; while (true) yield i++; }&lt;br /&gt;
 &lt;br /&gt;
 // 自然数の中から偶数を選び、それぞれ2乗した先頭5個を配列で取得&lt;br /&gt;
 const result = naturals()&lt;br /&gt;
    .filter(n =&amp;gt; n % 2 === 0)   // 偶数のみ (遅延)&lt;br /&gt;
    .map(n =&amp;gt; n * n)             // 2乗 (遅延)&lt;br /&gt;
    .take(5)                     // 先頭5個 (遅延)&lt;br /&gt;
    .toArray();                  // ここで初めて評価が実行される&lt;br /&gt;
 &lt;br /&gt;
 console.log(result);  // [4, 16, 36, 64, 100]&lt;br /&gt;
 &lt;br /&gt;
 // 配列の反復メソッドとの比較&lt;br /&gt;
 // Array.prototype を使う場合、各ステップで中間配列が生成される&lt;br /&gt;
 const arrayResult = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&lt;br /&gt;
    .filter(n =&amp;gt; n % 2 === 0)   // 中間配列: [2, 4, 6, 8, 10]&lt;br /&gt;
    .map(n =&amp;gt; n * n)             // 中間配列: [4, 16, 36, 64, 100]&lt;br /&gt;
    .slice(0, 5);                // [4, 16, 36, 64, 100]&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
下表に、イテレータヘルパーの全メソッドを示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ イテレータヘルパー一覧&lt;br /&gt;
! メソッド !! 戻り値 !! 評価タイミング !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;map(fn)&amp;lt;/code&amp;gt; || Iterator || 遅延 || 各要素に関数を適用する&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;filter(fn)&amp;lt;/code&amp;gt; || Iterator || 遅延 || 条件に合う要素のみを通す&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;take(n)&amp;lt;/code&amp;gt; || Iterator || 遅延 || 先頭 n 個で完了するイテレータを返す&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;drop(n)&amp;lt;/code&amp;gt; || Iterator || 遅延 || 先頭 n 個をスキップする&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flatMap(fn)&amp;lt;/code&amp;gt; || Iterator || 遅延 || マップして1段階フラットにする&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;reduce(fn, init)&amp;lt;/code&amp;gt; || 値 || 即時 || すべての要素を集約して値を返す&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;toArray()&amp;lt;/code&amp;gt; || Array || 即時 || すべての要素を配列に変換する&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;forEach(fn)&amp;lt;/code&amp;gt; || undefined || 即時 || 各要素に対して副作用を実行する&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;some(fn)&amp;lt;/code&amp;gt; || boolean || 即時 || いずれかの要素が条件を満たすか&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;every(fn)&amp;lt;/code&amp;gt; || boolean || 即時 || すべての要素が条件を満たすか&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;find(fn)&amp;lt;/code&amp;gt; || 値 / undefined || 即時 || 最初に条件を満たす要素を返す&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== Iterator.from ====&lt;br /&gt;
&amp;lt;code&amp;gt;Iterator.from(obj)&amp;lt;/code&amp;gt; は既存のイテレータまたはイテラブルから、イテレータヘルパーのメソッドを持つ &amp;lt;code&amp;gt;Iterator&amp;lt;/code&amp;gt; オブジェクトを作成する静的メソッドである。&amp;lt;br&amp;gt;&lt;br /&gt;
これにより、組み込みの配列やカスタムイテラブルに対してもイテレータヘルパーを適用できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 // 配列からイテレータヘルパーを使用する&lt;br /&gt;
 const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];&lt;br /&gt;
 const result = Iterator.from(arr)&lt;br /&gt;
    .filter(n =&amp;gt; n % 3 === 0)&lt;br /&gt;
    .map(n =&amp;gt; n * 10)&lt;br /&gt;
    .toArray();&lt;br /&gt;
 console.log(result);  // [30, 60, 90]&lt;br /&gt;
 &lt;br /&gt;
 // カスタムイテラブルからイテレータヘルパーを使用する&lt;br /&gt;
 const range = {&lt;br /&gt;
    [Symbol.iterator]() {&lt;br /&gt;
       let i = 1;&lt;br /&gt;
       return { next: () =&amp;gt; i &amp;lt;= 5 ? { value: i++, done: false } : { done: true } };&lt;br /&gt;
    }&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const rangeResult = Iterator.from(range)&lt;br /&gt;
    .map(n =&amp;gt; n * n)&lt;br /&gt;
    .toArray();&lt;br /&gt;
 console.log(rangeResult);  // [1, 4, 9, 16, 25]&lt;br /&gt;
 &lt;br /&gt;
 // NodeList (DOM) にも適用できる&lt;br /&gt;
 // const items = Iterator.from(document.querySelectorAll(&amp;quot;li&amp;quot;))&lt;br /&gt;
 //    .filter(el =&amp;gt; el.classList.contains(&amp;quot;active&amp;quot;))&lt;br /&gt;
 //    .map(el =&amp;gt; el.textContent)&lt;br /&gt;
 //    .toArray();&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 関連情報 ==&lt;br /&gt;
* [[JavaScriptの基礎 - Map]]&lt;br /&gt;
*: Map、WeakMap、Map.groupBy&lt;br /&gt;
* [[JavaScriptの基礎 - Set]]&lt;br /&gt;
*: Set、WeakSet、ES2025集合演算&lt;br /&gt;
* [[JavaScriptの基礎 - 配列の反復メソッド]]&lt;br /&gt;
*: forEach, map, filter, reduce等の反復処理メソッド&lt;br /&gt;
* [[JavaScriptの基礎 - スプレッド構文]]&lt;br /&gt;
*: オブジェクト / 配列のスプレッド&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#seo:&lt;br /&gt;
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki&lt;br /&gt;
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板&lt;br /&gt;
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux&lt;br /&gt;
|image=/resources/assets/MochiuLogo_Single_Blue.png&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:Web]]&lt;/div&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
</feed>