浅拷贝的理解
浅拷贝的话只会拷贝基本数据类型,例如像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]

深拷贝实现方式2: 使用递归调用的方式
1.首先我们先封装一个函数取名为 deepClone,里面传入一个参数,默认传的是一个对象
2.判断这个传入的参数是数组还是对象如果传入不是对象,直接返回
3.判断传入的传入的参数类型
4.开始循环,递归的进行拷贝
const old={
name:'zhang',
age:17,
colors:['pink','yellow','green'],
friend:{
name:'小白'
}
}
//深拷贝的函数
function deepClone(oldObj={}){ //这个函数会接收一个参数
//判断这个拷贝的对象要么是一个对象要么是一个数组
if(typeof oldObj !=='object' || oldObj ==null){ //这对象不是一个对象或者是一个null
return oldObj; //返回这个传入的参数值
}
//经过上一层检验的时候,发现是一个对象,会继续走下面拷贝的流程,拷贝的时候又会递归的调用clone
//最终拷贝的是对象的完整结果,拷贝的过程
let result;
if(oldObj instanceof Array){ //判断参数是否传入的是一个数组
result=[] //如果是一个数组就把他复制成一个数组的格式
}else{
result={} //如果不是就把他复制成一个对象的格式
}
for(let key in oldObj){
//将原来的属性拷贝到新的里面 key => 对象属性所对应的值
result[key] =deepClone(oldObj[key] ) //递归调用拷贝
}
return result;
}
const obj=deepClone(old)