【Javascript】 分割代入について（オブジェクト編）ーDestructuring Objects

# 初めに
ES6に新たに導入された便利な構文の一つに「分割代入（destructuring)」があります。前回に引き続き、分割代入について学習した内容をもとにいろいろ試してみました。外部APIを利用する際に非常に役に立つので記事にしてみました。

前回の記事
:https://qiita.com/redrabbit1104/items/3ba4783c658ebfa624a0

※内容に間違いなどがある場合はご指摘をよろしくお願いします。

# オブジェクトを分割代入してみる
###① 配列の代入と違うところ（注意点）

配列を分割代入する場合、配列の中身はindexによって取得できるため変数名を指定するだけで済みました。これに対してオブジェクトはkeyとvalueが存在するので書き方が若干違います。

```javascript
//配列の場合
const flowers = ['薔薇', '桜', '朝顔', 'ひまわり']
const [a, b, c, d] = flowers;
console.log(a, b, c, d);
```
指定した変数a,b,c,dにそれぞれの値が入っていることが分かります。
![スクリーンショット 2021-05-16 7.18.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/a125ae4b-6841-43bf-86d4-58ee3404834a.png)

同じ要領でfruitというオブジェクトで試してみました。

```javascript
//オブジェクトの場合
const fruits = {
  name: 'apple',
  price: 200,
  taste: 'good',
}
const { a, b, c } = fruits;
console.log(a, b, c);
```
結果はundefinedです。オブジェクトはkeyとvalueの２つの要素になっているので、変数名はjavascript側で認識できるような形にしなければなりません。
![スクリーンショット 2021-05-16 7.21.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/e66fd114-f15f-69f3-ea09-5d85e779a3be.png)

###②key名を変数名として使う
オブジェクトを分割代入したい場合にはkey名を変数名に指定すれば簡単に値が取れます。

```javascript
//key名を変数名として指定する
const fruits = {
  name: 'apple',
  price: 200,
  taste: 'good',
}

const { name, price, taste } = fruits;
console.log(name, price, taste);
```
変数name, price, tasteにそれぞれの値が代入されていることがわかる。
![スクリーンショット 2021-05-16 7.25.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/6ccfa15d-1a4c-8fd2-afd9-d894fc66dc3d.png)
しかし、このままでは代入する変数名とオブジェクトのkey名が同じになってしまいます。

###③key名:変数名
オブジェクトを分割代入として認識させるにはkey名がなければなりません。そこでkey名の横に':'を付けてその隣に指定したい変数名を入れる方法があります。

```javascript
//name,price,tasteのキーを変数a,b,cに指定する
const fruits = {
  name: 'apple',
  price: 200,
  taste: 'good',
}

const { name: a, price: b, taste: c } = fruits;
console.log(a, b, c);
```
結果としてキーの値（value)が出力されます。違うのは今回はa,b,cという変数名であり、キー名ではありません。
![スクリーンショット 2021-05-16 7.33.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/9cbe0c8c-931a-6a5a-7261-02a76a275419.png)

###④デフォルト値を指定
配列の分割代入と同様、オブジェクトの分割代入も取れた値がなかった場合のためのデフォルト値を指定することができます。デフォルト値は'=値'にすることで指定できます。4番目のplaceはfruitsの中身として存在すると仮定した上で、任意に付けたキー名です。

```javascript
const fruits = {
  name: 'apple',
  price: 200,
  taste: 'good',
}

const { name: a = 'null', price: b = 'null', 
        taste: c = 'null', place = 'null' } = fruits;
console.log(a, b, c, place);
```
placeというキーは存在しないため、デフォルト値に指定した'null'が表示されます。
![スクリーンショット 2021-05-16 7.51.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/6b6d8991-8cfd-98b1-236f-cebd0cd882d4.png)

###④宣言した変数の値を分割代入で上書き
一度宣言した変数をオブジェクトにある変数に上書きすることもできます。配列の分割代入と同じやり方でやってみます。

```javascript
const fruits = {
  name: 'apple',
  price: 200,
  taste: 'good',
}

let name = 'banana';
let price = 300;
let taste = 'not bad';
{ name, price, } = fruits;
console.log(name, price, taste);
```
見事にエラーが出ます。原因としては{}はjavascriptではcode blockとして認識するため、{で始まるとシンタックスエラーが出ます。これは即時関数の時と同じです。

![スクリーンショット 2021-05-16 8.08.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/bb3bd84d-5243-61a6-0b0e-b4d927c0ed6c.png)
なのでコードを( )で囲ってあげます。

```javascript
const fruits = {
  name: 'apple',
  price: 200,
  taste: 'good',
}

let name = 'banana';
let price = 300;
let taste = 'not bad';
({ name, price, } = fruits);     // (  )で囲む　
console.log(name, price, taste);
```
nameとpriceが'apple'と200に上書きされました。tasteはそのまま'not bad'で表示されます。
![スクリーンショット 2021-05-16 8.13.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/f40a3ac3-c768-7867-1541-970b03632810.png)

###⑤ネストされているオブジェクトから分割代入して値を取る
オブジェクトの中にオブジェクトがある場合には次のように分割代入します。

```javascript
const fruits = {
  apple: {
    place: {
      tokyo: 'apple',
      nagoya: 'banana',
      koube: 'orange'
    },
  },
};

const {
  place: { tokyo, nagoya, koube },
 } = fruits.apple;
console.log(tokyo, nagoya, koube);
```
若干複雑になってきますが、値はちゃんと取れてます。
![スクリーンショット 2021-05-16 9.13.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/c337d4b3-af0a-fabb-9ca9-73258556e737.png)

#参考サイト
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/block