[TOC]
* * * * *
## `Object.assign(target,source) `
> 拷貝對象
### 1. 淺拷貝
> 就是source對象只有一層,即它的子元素的值都是基礎數據類型,不是對象;
> 這樣可以完成生成一個屬性一模一樣的對象出來

>[warning] 如果目標對象里本來就有屬性存在,源對象中沒有相同的屬性則不會影響目標對象中已有的屬性,有相同的話會被源對象中的值替換。
* * * * *
### 2. 這樣的深拷貝不能用
> 深拷貝,子元素的值中包含復雜類型
~~~
var o={
a1: 0,
a2:[0,1],
a3: { a31: 0 },
a4: {
a41: {
a411: 0
}
}
};
var o1=Object.assign({}, o);
JSON.stringify(o1)
"{"a1":0,"a2":[0,1],"a3":{"a31":0},"a4":{"a41":{"a411":0}}}"
~~~
>[info] 這里的最外邊的兩個雙引號,只是為了滿足形式,如果去掉就是個真正的對象了。
> 如果直接用` console.log(o1) `輸出的形式里復雜對象都是帶了類型的,不利于賦值和觀察字面量
* * * * *
### 3. 使用 `JSON.parse(JSON.stringify())` 實現深拷貝
~~~
var o1=Object.assign({}, o);
JSON.stringify(o1)
'{ "a1":0, "a2":[0,1], "a3":{"a31":0}, "a4":{ "a41":{ "a411":0 } } }'
~~~
> 相當于使用符合對象形式的字符串去重新生成了一個對象,經測試3層的完全可以拷貝出來
>[danger] PS:怎么不用 = 呢 ?可能新手會有這樣的疑惑,要知道如果這里用等號去拿另一個對象,只是拿到了源對象在內存中的引用,源對象和目標對象指向同一個內存中的地址,那么兩者的改動會互相影響。
>
* * * * *