1.简单来说,深拷贝和浅拷贝都是针对引用类型,js中,如Object,Array,Date类型等
2.浅拷贝:复制过去的是同一内存地址,变量之间所做的更改,各自影响彼此
如:
var arr1=[0,1,2]
var arr2=arr1
arr2[0]==100
console.log(arr1)//[100,1,2]
console.log(arr2)//[100,1,2]
3.深拷贝,值赋值,但内存地址不同,即相当于新建了一个对象副本,各自互不影响,彼此独立
如:
var arr1 =[0,1,2]
var arr2 =[];
arr1.forEach((item,index)=> arr2[index]=item)
arr2[0]=100
console.log(arr1)//[0,1,2]
console.log(arr2)//[100,1,2]
4.深拷贝方法
①Object.assign(target, …sources)
target目标对象,即拷贝赋值对象 ;sources传值对象,源对象
sources源对象中属性的content不包含引用类型时,target直接获得深拷贝对象
但当sources中某一属性的content为引用类型时,需进行递归遍历,将其变为基本类型赋值
如:
ob1={a:1, b:2, c:3 }
ob2={}
Object.assign(ob2, ob1)
ob1.a=2
console.log(ob1,ob2) // {a: 2, b: 2, c: 3} {a: 1, b: 2, c: 3}
属性中又含有引用类型,object
ob1={a:1,b:2,c:{value:3 }}
ob2={}
Object.assign(ob2, ob1)
ob1.a=33333
ob1.c.value=2
console.log(ob1,ob2) // {a: 33333, b: 2, c: {value:2}} {a: 1, b: 2, c: {value:2}}
此时,ob2中属性c中的属性会随着ob1中的属性c变化而变化,因为赋值过来的是引用类型,object
而属性a的值不会随着ob1中的属性a的值变化而变化,因为赋值过来的是基本类型,number
②简单的深拷贝方法,通过JSON.parse(JSON.stringify(ob1))实现,先将对象转为字符串,再进行解析,相对于新建了一个属性名和值都相同的新对象,从而实现深拷贝
var ob1={a:1,b:2,c:{value:3 }}
if(ob1){
var ob2=JSON.parse(JSON.stringify(ob1))
ob1.a=33333
ob1.c.value=2
console.log(ob1,ob2)
}