Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2015年10月以降、すべてのブラウザーで利用可能です。
スプレッド構文 (...) 構文を使うと、配列式や文字列などの反復可能オブジェクトを、0 個以上の引数(関数呼び出しの場合)や要素(配列リテラルの場合)を目的の場所に展開することができます。オブジェクトリテラルでは、スプレッド構文によりオブジェクトのプロパティを列挙し、作成するオブジェクトにキーと値の組を追加します。
スプレッド構文は、残余構文とまったく同じように見えますが、ある意味では、スプレッド構文は残余構文の反対です。スプレッド構文は配列を要素に「展開」しますが、リスト構文は複数の要素を集合し、単一の要素に「圧縮」します。残余引数と残余プロパティを参照してください。
スプレッド構文は、オブジェクトまたは配列の要素をすべて新しい配列またはオブジェクトに含める必要がある場合、または関数呼び出しの引数リストに1つずつ適用する必要がある場合に使用することができます。スプレッド構文を受け入れる場所は 3 つあります。
構文は同じように見えますが、意味づけが若干異なります。
反復可能な値、例えば Array や String のみが、配列リテラルと引数リストを展開できます。多くのオブジェクトは反復可能ではありません。例えばプレーンオブジェクトに Symbol.iterator メソッドがない場合はそうなります。
一方、オブジェクトリテラルでの展開は、値自身のプロパティを列挙します。一般的な配列では、すべてのインデックスが列挙可能な自分自身のプロパティであるため、配列をオブジェクトに展開することができます。
すべてのプリミティブはオブジェクトに展開できます。 文字列のみ自分自身で列挙可能なプロパティを持っており、それ以外は何らかのプロパティを新しいオブジェクトに作成することなく展開できます。
関数呼び出しにスプレッド構文を使用する場合、JavaScript エンジンの引数長制限を超える可能性があることに注意してください。詳細は、Function.prototype.apply() を参照してください。
配列の要素を引数にして関数を呼び出すには Function.prototype.apply() を使うのが一般的です。
スプレッド構文を使うと、上のコードは次のように書くことができます。
スプレッド構文は、引数リストのどの引数でも使用でき、またスプレッド構文は複数回使用することもできます。
コンストラクターを new で呼び出す場合、配列を直接使用して apply() を実行することはできません。なぜなら、apply() は対象関数を構築するのではなく呼び出すためです。つまり、new.target は undefined になります。しかし、配列は new を使用すると、スプレッド構文のおかげで簡単に使用することができます。
スプレッド構文を使用しない場合、既存の配列を一部として使用して新しい配列を作成するには、配列リテラル構文は十分ではなく、push(), splice(), concat() などを組み合わせて使う高圧的なコードを使用しなければなりません。
関数の引数と同様に、... は配列リテラルのどこでも、何回でも使えます。
スプレッド構文を使用して配列のシャローコピーを作成することができます。配列のそれぞれの要素は、コピーされることなく、その同一性を保持します。
スプレッド構文は、配列をコピーする際に効果的に 1 レベル深くコピーします。したがって、多次元配列のコピーには適していない可能性があります。Object.assign() でも同様です。JavaScript では、ネイティブの操作でディープクローンを行うものはありません。Web API メソッドの structuredClone() では、特定の対応している型の値をディープコピーすることができます。詳細は、シャローコピーを参照してください。
ある配列を既存の配列の末尾に連結するには、Array.prototype.concat() がよく使われます。スプレッド構文を使用しないと、これは次のように行われます。
スプレッド構文を使うと、次のように書けます。
Array.prototype.unshift() は、値の配列を既存の配列の先頭に挿入するためによく使われます。スプレッド構文を使用しないと、これは次のように行われます。
スプレッド構文を使うと、次のようになります。
メモ: unshift() とは異なり、これは新しい arr1 を生成しており、その場では元の arr1 を変更しません。
条件演算子を使用すると、条件に応じて、配列リテラル内の要素を存在させたり、存在させなかったりすることができます。
条件が false の場合、空の配列を展開し、最終的な配列に何も追加しないようにします。これは、次のものとは異なることに注意してください。
この場合、追加の undefined の要素が isSummer が false のときに未定義の要素が追加され、この要素は Array.prototype.map() などのメソッドによって参照されます。
スプレッド構文を使用して、複数のオブジェクトを 1 つの新しいオブジェクトにマージすることができます。
単一のスプレッドは、元のオブジェクトのシャローコピーを作成します(ただし、列挙不可能なプロパティは含まれず、プロトタイプもコピーされません)。これは配列をコピーするのに似ています。
あるオブジェクトが別のオブジェクトに展開されるとき、または複数のオブジェクトが1つのオブジェクトに展開されるときに、同じ名前のプロパティが検出された場合、プロパティは最後に割り当てられた値を採り、元の設定した位置のままとなります。
条件に応じて、オブジェクトリテラルで要素を存在する、または存在しないようにすることができます。条件演算子を使用します。
条件が false の場合は空オブジェクトとなり、最終オブジェクトに何も取り込まれません。これは、次のものと異なることに注意してください。
この場合、watermelon プロパティは常に存在し、Object.keys() などのメソッドによって参照されます。
プリミティブもオブジェクトに展開できること、そして、列挙値には偽値がないという観察結果から、単純に論理 AND 演算子を使用することができます。
この場合、isSummer が偽値であれば、fruits オブジェクトにプロパティは作成されません。
オブジェクトを変更するには Object.assign() を使用することができますが、スプレッド構文は使用できないことに注意してください。
さらに、Object.assign() は対象とするオブジェクトのセッターを開始しますが、スプレッド構文では開始しません。
単一の展開で Object.assign() 関数を単純に再実装することはできません。
例えば、上記の例では、スプレッド構文は期待通りに動作しません。残余引数により、オブジェクトリテラルに引数の配列が展開されます。以下は、スプレッド構文を使用した merge の実装例です。この動作は Object.assign() に似ていますが、セッターを起動せず、オブジェクトを変更しないという点が異なります。
| ECMAScript® 2027 Language Specification # prod-SpreadElement |
| ECMAScript® 2027 Language Specification # prod-ArgumentList |
| ECMAScript® 2027 Language Specification # prod-PropertyDefinition |
ブラウザー互換性一覧表を表示するには、JavaScript を有効にしてください。
より良いインターネットのための青写真。
このコンテンツの一部は、©1998–2026 個人の mozilla.org 協力者です。コンテンツはクリエイティブ・コモンズ・ライセンスのもとで利用できます。