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) ``` ![](https://i.imgur.com/CeXYlOy.png) 淺層複製是可以對物件第一層屬性自由更動不會影響到原物件,但是第二層之後的就還是會參考到元物件屬性了,所以萬一把 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)