个人总结:浅谈js中的深拷贝

深拷贝

基本类型

在学习深拷贝和浅拷贝之前,一定要了解基本数据类型和引用数据类型
基本数据类型的数据都放在内存中,复制的时候就直接值复制。你可以理解为 “基站基栈”。
在这里插入图片描述

引用类型

引用类型的数据存放在堆中,栈内存中只存放具体的地址值,object1赋值给object2的时候是把object1的地址值赋值给了object2,这个时候两个对象同时指向堆内存中的同一数据。

var object1 = new Object();
var object2 = object1;

在这里插入图片描述

深拷贝和浅拷贝的区别

浅拷贝和深拷贝都是相对于引用类型来说的。
浅拷贝:你可以理解为值的复制,在引用类型中,浅拷贝只是将值进行复制,两个对象还是指向同一个堆内存空间
深拷贝:可以理解为循环复制,深拷贝可以对对象的属性进行递归复制;

实现深拷贝的方式

1.Object.assign

Object.assign({}, obj1):先建立一个空对象{},接着把obj1中所有的属性复制过去,所以obj2会长得跟obj1一样,这时候再修改obj2.b也不会影响obj1。
局限:对象只有一层的时候 是深拷贝。

 var obj1 = {
    a: 1,
    b: 2,
    c: 3
}
var obj2 = Object.assign({}, obj1);
obj2.b = 5;
console.log(obj1.b); // 2
console.log(obj2.b); // 5
2.JSON.parse+JSON.stringify

用JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象。
局限: Number, String, Boolean, Array,可以转为JSON对象,但是function 这种不行。

3.lodash实现深拷贝

lodash很热门的函数库,提供了 **lodash.cloneDeep()**实现深拷贝

4.递归拷贝
function deepclone(obj){
if(typeof obj==='object'){
var result = obj.constructor=='Array'?[]:{};
for(let i in obj){
result[i] = typeof result[i]==-'object'?deepclone(result[i]):result[i]
}
}else{
var result = obj
}
return result 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值