Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2016年8月.
構造分解(destructuring、旧:分割代入)構文は、配列から値を取り出して、あるいはオブジェクトからプロパティを取り出して別個の変数に代入することを可能にする JavaScript の構文です。これは、データを受け取る場所(代入の左辺や、新しい識別子バインディングを作成する場所ならどこでも)で使用できます。
オブジェクトリテラルと配列リテラルは、いくつかのデータをアドホックにまとめる簡単な方法を提供します。
構造分解は、同様の構文を代入の左辺で使用します。これは、集合のそれぞれの要素を別個の変数として宣言することにより、配列の宣言と逆の操作を行います。
オブジェクトの場合は、下記の 2 組の記述を比較し、それぞれの組の中でどのように対応しているのかを確認してください。
この機能は、 Perl や Python などの言語に存在する機能に似ています。
配列またはオブジェクトの構造分解に関する機能については、以下の個々の例を参照してください。
オブジェクトと配列の構造分解には、2 種類の構造分解のパターンがあります。バインドパターンと代入パターンであり、構文が若干異なります。
バインドパターンでは、宣言キーワード(var、let、const)から始めます。次に、個々のプロパティを変数にバインドするか、さらに構造分解する必要があります。
すべての変数で同じ宣言を共有するので、ある変数だけ再代入可能にし、他は読み取り専用にしたい場合は、let で 1 回、const で 1 回の 2 回の構造分解が必要になる場合があります。
言語が変数をバインドする他の多くの構文でも、構造分解のバインドパターンが使用できます。これには次のようなものがあります。
代入パターンでは、パターンはキーワードで始まりません。それぞれの構造分解されたプロパティが、代入先に代入されます。この代入先は var や let であらかじめ宣言されているか、他のオブジェクトのプロパティです。一般的には、代入式の左辺に現れることができるものなら何でも構いません。
メモ: 宣言なしでオブジェクトリテラルの構造分解を使用する場合、代入文を囲む括弧 ( ... ) が必要です。
{ a, b } = { a: 1, b: 2 } は、左辺の { a, b } が式文のルールによりオブジェクトリテラルではなくブロックとみなされるため、単体では有効な構文ではありません。しかし、({ a, b } = { a: 1, b: 2 }) は有効であり、const { a, b } = { a: 1, b: 2 } も同様です。
もし、お使いのコーディングスタイルで末尾のセミコロンを記述していない場合は、( ... ) 式の前にセミコロンを記述する必要がありますし、前の行の関数を実行するために使用される可能性もあります。
上のコードの等価なバインドパターンは、有効な構文ではないことに注意してください。
代入パターンは代入演算子の左辺としてのみ使用できます。+= や *= などの複合代入演算子では使用できません。
それぞれの構造分解されたプロパティは、既定値 を持つことができます。既定値は、プロパティが存在しないか、値が undefined である場合に使用されます。プロパティが値 null を持つ場合は使用されません。
既定値には、任意の式を指定することができます。必要なときだけ評価されます。
構造分解パターンは、残余プロパティ ...rest で終了することができます。配列の構造分解の場合、反復可能オブジェクトの残りの要素が rest (または任意の名前) という新しい配列に収められます。オブジェクトの構造分解の場合、オブジェクトの構造分解パターンによってまだ選択されていない、列挙可能なすべてのプロパティが rest という新しいオブジェクトにコピーされます。
より正式には、 ...rest 構文は、配列の構造分解では「残余要素」、オブジェクトの構造分解では「残余プロパティ」と呼ばれますが、多くの場合、これらはまとめて「残余プロパティ」と呼ばれます。
残余プロパティは、パターンの最後のものでなければならず、末尾のカンマがあってはなりません。
代入の右側に指定された長さ N の配列から構造分解する場合、代入の左側に指定された変数の数が N より大きい場合、最初の N 個の変数にのみ値が代入されます。残りの変数の値は undefined となります。
構造分解を使用して、複数の変数の値を入れ替えることができます。
構造分解を使用せずに 2 つの値を交換するには、一時変数(または、一部の低水準言語においては XOR 交換アルゴリズム)が必要です。
関数は配列を返すことがあります。構造分解によって、返された配列の使用をより簡潔に記述できます。
この例では、f() は出力として値 [1, 2] を返しており、構造分解により 1 行で解析できます。
関心のない返値は無視することができます。
このようにすべての返値を無視することもできます。
ただし、この場合は、関数を呼び出して構造分解をまったく使用しないほうがより明確でしょう。必ずしも返値を使用する必要はありません。
配列の構造分解の残余プロパティは、別の配列やオブジェクトの結合パターンにすることができます。残りの要素を集めた後に作成された配列から、内部の構造分解で構造を分解します。そのため、この方法では元の反復可能な要素に存在するプロパティにアクセスすることはできません。
これらのバインドパターンは、それぞれの残余プロパティがリストの最後のものである限り、入れ子にすることも可能です。
一方、オブジェクトの構造分解では、残余プロパティとして識別子しか保有することができません。
正規表現オブジェクトの exec() メソッドは一致するものを見つけ、最初に一致した文字列全体の一部と、正規表現内の各括弧で囲まれたグループに一致した文字列の部分を含む配列を返します。構造分解によって、簡単にこの配列の一部分を取り出せます。また必要でない場合は、完全一致を無視できます。
配列の構造分解を行うと、右辺の反復可能プロトコルが呼び出されます。したがって、配列に限らず、任意の反復可能オブジェクトを構造分解することができます。
反復可能でないものは、配列として構造分解できません。
反復可能オブジェクトは、すべてのバインドが代入されるまでしか反復処理しません。
残りのバインドは貪欲に評価され、古い反復可能オブジェクトを使用する代わりに、新しい配列を作成します。
オブジェクトから変数を取り出して、オブジェクトのプロパティとは異なる名前の変数に代入することができます。
ここで、例えば、const {p: foo} = o はオブジェクト o から p という名前のプロパティを取り、foo という名前のローカル変数へ代入します。
プロパティは、次のようにすることができます。
関数の引数に渡されたオブジェクトは、変数に展開し、関数本体内でアクセスすることも可能です。 オブジェクトの代入に関しては、構造分解構文により、新しい変数に元のプロパティと同じ名前または異なる名前を持たせることができ、元のオブジェクトがプロパティを定義していない場合の既定値を割り当てることができます。
ユーザーに関する情報を格納したオブジェクトを考えてみましょう。
ここでは、合格したオブジェクトのプロパティを同じ名前の変数に展開する方法を示します。 引数値 { id } は、関数に渡されたオブジェクトの id プロパティを同じ名前の変数に展開し、関数内で使用できるようにすることを示します。
展開した変数の名前を定義することができます。 ここでは、displayName というプロパティを展開し、関数本体内で使用するために dname という名前に変更しています。
入れ子になっているオブジェクトも展開することができます。 下記の例では、プロパティ fullname.firstName が name という変数に展開されています。
既定値は = で指定することができ、指定したプロパティが渡されたオブジェクトに存在しない場合、変数の値として使用されます。
既定値が、サイズが 'big' で、座標が x: 0, y: 0 で、半径が 25 の関数です。
上記の drawChart の関数呼び出し形式では、次のようにして、構造分解された左辺に、右辺側で空のオブジェクトリテラルを代入しています。
右辺の代入がない関数を書くこともできます。しかし、右辺の代入を取り除いた場合、関数は実行されたときに少なくともひとつの引数が提供されることを期待しますが、この形式では何も引数を指定せずに単純に drawChart() を呼び出すことができます。この設計は引数を指定せずに関数を呼び出せるようにしたい場合に役に立ちますし、もう一方の形式は、オブジェクトを確実に関数に渡したい場合に役に立ちます。
詳しくは、デフォルト引数 > 既定値のある構造分解の引数を参照してください。
オブジェクトリテラルのような計算されたプロパティの名前も構造分解で使用できます。
JavaScript で有効な代替識別子を与えることにより、JavaScript で有効ではない識別子であるプロパティ名を構造分解で使用できます。
オブジェクトの構造分解は、プロパティへのアクセスとほぼ等価です。 つまり、プリミティブ値を分解しようとすると、値が対応するラッパーオブジェクトに取得され、プロパティはラッパーオブジェクトにアクセスされることになります。
プロパティへのアクセシビリティと同様に、null や undefined を構造分解すると TypeError が発生します。
これは、パターンが空のときにも起こります。
配列とオブジェクトの構造分解は組み合わせることができます。配列 props の 3 番目の要素にあるオブジェクトの name プロパティが欲しい場合、次の操作ができます。
オブジェクトが分割されるときで、自分自身のプロパティがアクセスされない場合は、プロトタイプチェーンを辿って参照が続けられます。
| ECMAScript® 2027 Language Specification # sec-destructuring-assignment |
| ECMAScript® 2027 Language Specification # sec-destructuring-binding-patterns |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 2026年4月13日 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.