[TOC]
* * * * *
## `Object.assign(target,source) `
> 拷贝对象
### 1. 浅拷贝
> 就是source对象只有一层,即它的子元素的值都是基础数据类型,不是对象;
> 这样可以完成生成一个属性一模一样的对象出来
![](https://box.kancloud.cn/48fbdaec2ffd22de790a4751102bd284_293x352.png)
>[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:怎么不用 = 呢 ?可能新手会有这样的疑惑,要知道如果这里用等号去拿另一个对象,只是拿到了源对象在内存中的引用,源对象和目标对象指向同一个内存中的地址,那么两者的改动会互相影响。
>
* * * * *