浅拷贝的理解
浅拷贝的话只会拷贝基本数据类型,例如像string、Number等这些,类似:Object、Array 这类的话拷贝的就是对象的一个指针(通俗来讲就是拷贝一个引用地址,指向的是一个内存同一份数据),也就是说当拷贝的对象数据发生变化,原始数据也会跟着发生改变,是相互影响的。
补充:浅拷贝的话只会拷贝数据的第一层,更深层的是无法拷贝。
代码注解如下所示:常用的写浅拷贝方案:我这里用的是Object.assign() 方法
let person={
name:"zhang",
age:18,
arr:[1,2,3],
abj:{
a:1,
b:2,
c:3
}
}
let copyObj=Object.assign({},person)
console.log(copyObj)//name:'zhang',age: 18, arr:[2,2,2], abj: {a: 'hhahahha', b: 2, c: 3}
copyObj.name=18
copyObj.arr=[2,2,2]
copyObj.abj.a="hhahahha"
console.log(copyObj.name,"copyObj") //18,"copyObj"
console.log(person.name,"person") //zhang person
console.log(copyObj.arr,"copyObj") // [2, 2, 2] 'copyObj'
console.log(person.arr,"person") // [1, 2, 3] 'person'
console.log(copyObj.abj.a,"copyObj")//hhahahha copyObj
console.log(person.abj.a,"person")//hhahahha person
深拷贝的理解:
深拷贝不仅对指针进行了拷贝,还对指针指向的内容进行了拷贝,也就是说另外申请了一块内存空间,内容和原对象一致,但是两份独立的数据,更改原对象时拷贝的对象是不会发生变化的。
代码注解如下所示:我这里实现深拷贝的方法是JSON 对象的序列化和反序列化方法实现的.
注意这个方法function,undefine 会丢失
let person={
name:"zhang",
age:18,
arr:[1,2,3],
abj:{
a:1,
b:2,
c:3
}
}
let copyobj=JSON.parse(JSON.stringify(person))
console.log(copyobj)//{name: 'zhang', age: 18, arr: [1,2,3], abj: { a:1,b:2,c:3}}
copyobj.arr[0]=3
console.log(copyobj.arr) //[3, 2, 3]
console.log(person.arr)//[1, 2, 3]