【JS】中深拷贝浅拷贝的区别和实现方式

本文介绍了JavaScript中深拷贝和浅拷贝的概念,浅拷贝只复制第一层,而深拷贝会创建全新的对象副本。提到了实现浅拷贝的方法如Object.assign、扩展运算符和slice,以及深拷贝的实现方式,包括JSON.parse和JSON.stringify结合、递归拷贝以及使用Lodash库的_.cloneDeep方法。文章还指出了深拷贝在处理复杂对象时的注意事项和限制。
摘要由CSDN通过智能技术生成

1、概念

  1. 赋值不属于拷贝
  2. JS的 深拷贝浅拷贝主要作用于多层数组或对象中,其中:

浅拷贝:

只对第一层 数组或对象进行复制,其它层复制的是原存储的内存地址(修改其它深层级会影响原对象)

深拷贝:

构造一个新的复合数组或对象,每一层级 都在堆内存中开辟了新的空间,与原数组或对象互相不影响。

2、实现方式

浅拷贝的实现方式:

  1. 针对对象:使用 Object.assign() 方法,例如:let newObj = Object.assign({}, oldObj);
  2. 针对数组或对象:使用扩展运算符(...)进行浅复制,例如:let newObj = {…oldObj};let newArr = […oldArr];
  3. 针对数组:使用数组的 slice() 方法进行浅复制,例如:let newArray = oldArray.slice()

深拷贝的实现方式

  1. JSON.parse(JSON.stringfy(obj))
    JSON.parse(JSON.stringify(obj)):将对象序列化为 JSON 字符串,再将字符串解析为新的对象。这种方式可以实现深拷贝,但有一些限制,例如无法复制函数、循环引用等不可序列化的属性;
  2. 手动递归拷贝
    使用递归的方式遍历对象的属性,逐一复制到新的对象中。这种方式可以实现深拷贝,但需要手动编写代码,并且不适用于嵌套层数较深的对象。
// 递归实现深拷贝
function deepClone(obj) {
 if (typeof obj !== 'object' || obj === null) {
   return obj;
 }
 let newObj = Array.isArray(obj) ? [] : {};
 for (let key in obj) {
   newObj[key] = deepClone(obj[key]);
 }
 return newObj;
}
  1. Lodash 的 _.cloneDeep() (使用第三方库)
    可以实现深拷贝,支持复制函数、循环引用等特殊属性,使用方便;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值