多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[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:怎么不用 = 呢 ?可能新手会有这样的疑惑,要知道如果这里用等号去拿另一个对象,只是拿到了源对象在内存中的引用,源对象和目标对象指向同一个内存中的地址,那么两者的改动会互相影响。 > * * * * *