浅拷贝和深拷贝是针对对象而言的复制
堆栈中:浅拷贝指的是复制栈里面的地址或堆里面的第一层值,如果对象不止一层的话浅拷贝就不适用了,深拷贝是把堆里面的内容完全复制到一个新对象里面,完全脱离母体
浅拷贝
//获取对象自身可枚举属性(可枚举属性就是对象里面存在的key),下面的keys是数组obj里面所有key的一个数组
let keys=Object.key(obj)
深拷贝
把oldobj堆里面的内容复制一份新的,赋值个另一个空对象newobj
由于一个对象可以嵌套各种基本类型和引用类型
所以怎么办呢?
什么是死循环?
出现死循环,使用分类(基本类和引用类)和递归(自己循环自己内部值),由于死循环没有尽头,所以使用递归循环会爆炸
什么是分情况讨论?
基本数据类型直接拷贝,如果是对象需要递归
下面是一个简单的深拷贝:
使用jQuery的深拷贝extend
注意extend用于两个对象合并时写不写true的区别
有true 深覆盖
无true 浅覆盖
JSON解决深拷贝
如果利用for in循环分情况讨论,会很复杂,死循环又会爆炸
怎么办呢?
把对象是JSON数据(JSON的方法来处理)
对象1=>字符串=>对象2
得到对象1和对象2是堆中两个不同空间的对象
JSON特点:
代码:
<script>
var oldobj={
name:"pearl",
age:24,
firend:{
name:"liu",
age:24
}
}
function deepCopy(obj){
var obj2;
obj2=JSON.stringify(obj);
obj2=JSON.parse(obj2);
return obj2;
}
var newobj=deepCopy(oldobj);//得到新对象newobj
newobj.age=40;//改变新对象中age的值,测试会不会牵连到oldobj
console.log(newobj);//输出新对象
console.log(oldobj);//输出oldobj对象
</script>
输出结果:
知乎 解决深浅拷贝的详细解答