JavaScript浅拷贝与深拷贝

一、理解

浅拷贝:只是拷贝一层,更深层次对象级别的只拷贝了地址

深拷贝:层层拷贝,每一级别的数据都会拷贝

深拷贝和浅拷贝主要是针对对象的属性是对象(引用类型)

二、浅拷贝

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)、拷贝后,修改拷贝后的对象,不影响之前的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值