一、理解
浅拷贝:只是拷贝一层,更深层次对象级别的只拷贝了地址
深拷贝:层层拷贝,每一级别的数据都会拷贝
深拷贝和浅拷贝主要是针对对象的属性是对象(引用类型)
二、浅拷贝
1、什么是浅拷贝
从字面上的意思理解,是指比较浅的拷贝,它与原来的变量仍然指向同一个地址,两者之间相互影响,即其中一个改变会影响另一个的改变。浅拷贝也被称为引用拷贝,引用的意思就是取了个别名,例如张三是大名,狗蛋是他的引用,即为小名,张三变了,狗蛋自然也变了,因为他们本质上就是指同一个人。
2.用Js实现浅拷贝
var obj = {
name:'梅西',
age:34,
tame:new Array('阿根廷','巴塞罗那','巴黎')
}
console.log(obj)
var newObj = {}
for(var key in obj) {
//key是当前属性名, obj[k]是当前属性值
newObj[key] = obj[key]
}
newObj.tame[2] = '巴黎圣日尔曼'
console.log(obj)
console.log(newObj)
结果展示:
从打印结果我们可以看出已经成功将obj的属性已经值拷贝进了newObj,但是我们应该意识到:obj.msg.age与newObj.msg.age他们引用的是同一个地址的数据,换句话说,newObj.msg只拷贝了obj.msg的地址,并不是如我们想象中一样,新建立一个地址去存放数据。
三、深拷贝
1、什么是深拷贝?
从字面上的意思理解,是指很深的拷贝,到底有多深呢?深到不仅拷贝值,而且还独立开辟了一个空间。在拷贝的过程中,独立地开辟了一个空间,这个对象指向这个地址,与原来的对象互不干扰。深拷贝也被称为值拷贝。
2、在JS中实现深拷贝
var obj = {
name:'梅西',
age:34,
tame:new Array('阿根廷','巴塞罗那','巴黎')
}
var newObj = {}
for(let key in obj){
if(typeof obj[key]=='object'){
newObj[key] = []
for(let k in obj[key] ){
newObj[key][k] = obj [key][k]
}
}else{
newObj[key] = obj [key]
}
}
newObj.tame[2] = '巴黎圣日尔曼'
console.log(obj)
console.log(newObj)
结果展示:
可以看到打印的结果只有newObj的tame2]变成了“巴黎圣日耳曼”),这里就体现出了深拷贝和浅拷贝的不同,在使用浅拷贝时,不论拷贝多少次,都只会用最初的地址中存放的数据,并不会重新开辟一个新的空间存放数据。而深拷贝则和浅拷贝完全不一样,在使用深拷贝时,不仅仅拷贝值,也会重新开辟一个新的空间,存放拷贝过来的值,并且这个新开辟的空间地址和原本的对象互不干涉。
四、总结
1、浅拷贝:
(1)、将原有的数据赋值过去,只进行一层拷贝,深层次的对象级别的就拷贝引用;
(2)、原始类型为值传递,对象类型仍为引用传递。;
(3)、是拷贝引用, 拷贝后的引用都是指向同一个存放数据位置的指针,;
(4)、拷贝后,修改拷贝后的对象,会影响拷贝前的对象。
2、深拷贝:
(1)、将数据中所有的数据赋值过去,无限层级拷贝,,每一级别的数据都会拷贝出来;
(2)、所有元素或属性均完全复制,与原对象完全脱离;
(3)、在堆中重新分配内存, 将源对象的各个属性复制进去.;
(4)、拷贝后,修改拷贝后的对象,不影响之前的对象。