JS 展開、拷貝
===
展開
==
在 ES6 中,可以利用簡單的方式就把兩個物件或兩個陣列進行合併,就是利用...展開語法合併:
```jsx
let groupA = ['Jordan','Zoe'];
let groupB = ['Lawrence', 'Alan'];
const groupAll = [...groupA, ...groupB];
console.log(groupAll);
//['Jordan','Zoe','Lawrence', 'Alan'];
```
在這之前是使用 `concat` 合併`const groupAll = groupA.concat(groupB);`
***
物件的參考特性
==
`...` 語法可以用在合併,也能用於複製,因為物件與陣列本身具有傳參考特性,所以可以利用 `...` 做淺層拷貝,以下做範例講解。
這裡有一個範例,大家都很清楚,person 傳值(賦值)給 person2,只是把值給 person2:
```jsx
let person = '小明'
let person2 = person
person2 = '杰倫'
console.log(person,person2)//小明 杰倫
```
但是物件就不同了,物件是傳參考,只是傳參考路徑,所以不會把裡面屬性傳給 person2,所以內容還是同一個:
```jsx
const person = {
name:'小明'
}
let person2 = person
person2.name = '杰倫'
console.log(person.name,person2.name)//杰倫 杰倫
console.log(person === person2)//true
```
淺層複製&深層複製
==
前面提到物件是傳參考值,所以如果 B物件 = A物件 ,當改動 A物件或 B物件時都會影響到彼此。這時候就有兩種方式,淺層、深層複製
### 淺層複製 shallow copy
```jsx
let family = {
name : '小明家',
members :{
mom : '漂亮阿姨',
son : '小明'
}
}
let family2 = {...family}
family2.name = '小王家'
console.log(family,family2)
```

淺層複製是可以對物件第一層屬性自由更動不會影響到原物件,但是第二層之後的就還是會參考到元物件屬性了,所以萬一把 members.son 改成小王,兩個家庭都會是小王。
### 深層複製 deep copy
主要是先把物件轉成字串,這樣就跟原物件沒關聯了,然後再轉為物件。
```jsx
let family4 = JSON.parse(JSON.stringify(family))
family4.
```
補充合併的部分:
物件合併也能使用 `Object.assign()`,特色是還能把有相同屬性的資料做後覆蓋:
```jsx
var o1 = { a: 1, b: 1, c: 1 };
var o2 = { b: 2, c: 2 };
var o3 = { c: 3 };
var obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 },屬性c為o3.c的值,最後一個出現的屬性c。
```
[查看完整 Object.assign 資訊請點擊這裡!](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)