深度复制的坑1对象assign复制的假深度,2数组slice复制的坑,3还有数组map复制的坑
Posted 刘金宇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度复制的坑1对象assign复制的假深度,2数组slice复制的坑,3还有数组map复制的坑相关的知识,希望对你有一定的参考价值。
1、对象复制的坑 Object.assign()
Object.assign() //浅复制 基本没用 跟直接用= 一样 Object.assign(true,{}) // 以为是深拷贝,其实只是一级属性复制,比浅拷贝多深拷贝了一层而已。第二层一样是浅拷贝,会改变原值
2、数组复制的坑,即使是slice复制,如果内部是对象的话,还是会地址指向,导致修改新数组的时候,老数组也改变
var arr = [{a:11},{a:11}]; //arr [{a:11},{a:11}] var arr1 = arr.slice(0); //arr1 [{a:11},{a:11}] arr1[0].a = 22 //以为arr不会跟着改变,结果竟然变了 //arr1 [{a:22},{a:11}] arr [{a:22},{a:11}]
结果证明,slice复制只是潜复制,不能深度复制对象内容
3、同样是数组复制的坑,如果数组内容元素是对象的话,map也会改变改变原值的
var arr = [{a:11},{a:11}]; //arr [{a:11},{a:11}] arr.map(v=>{ v.b=22; return v; }) //是不是以为这根arr没半毛钱关系,你太天真了,arr已经改变 //arr [{a:11,b:22},{a:11,b:22}] 已经多出来了个b属性。。。。
以上是关于深度复制的坑1对象assign复制的假深度,2数组slice复制的坑,3还有数组map复制的坑的主要内容,如果未能解决你的问题,请参考以下文章
在javascript中将对象数组复制到另一个数组中(深度复制)
在 Angular 2 + TypeScript 中深度复制数组