深拷贝和浅拷贝的区别

一、深拷贝

深拷贝是一种复制操作,其目的是创建一个对象的完全独立副本包括所有嵌套的对象或数组深拷贝后的副本与原始对象在内存中是完全独立的,对副本的任何修改都不会影响到原始对象。深拷贝有以下几个特征
1.1 完全独立:深拷贝创建的对象副本与原始对象在内存中是两个不同的实体。这意味着副本的内存地址与原始对象的内存地址不同。
1.2 递归复制:深拷贝会递归地复制对象的所有层级。如果对象包含引用类型的属性(如数组、对象等),深拷贝会为这些属性创建新的实例,并且继续递归复制这些新实例中的属性。
1.3 循环引用:深拷贝需要能够处理对象中的循环引用,即对象直接或间接地引用自己。这要求深拷贝算法能够跟踪已经复制过的对象,避免无限循环。
1.4 特殊类型处理:深拷贝需要能够处理特殊类型的值,如函数、undefined、Date、RegExp等。这些值在简单的序列化和反序列化过程中可能会丢失或变形。
1.5 性能考虑:深拷贝由于需要递归复制和处理特殊类型,通常比浅拷贝更消耗资源。因此,在性能敏感的应用中,需要谨慎使用。
1.6 不可枚举属性:深拷贝应该复制对象的所有属性,包括不可枚举的属性。
1.7 原型链:深拷贝通常不复制对象的原型链,而是创建一个具有相同构造函数的新实例。
1.8 局限性:深拷贝虽然能够复制大多数类型的数据,但对于某些特殊情况(如带有特殊引用的对象、代理对象等)可能无法正确处理。

三、浅拷贝

3.1 定义:浅拷贝创建了一个新的对象,但是这个对象的属性值是指向原始对象属性值的引用
3.2 行为:如果原始对象的属性是基本类型(如数字、字符串、布尔值),浅拷贝会复制这些值。如果属性是引用类型(如数组、对象、函数),浅拷贝只会复制引用,而不是引用的对象本身。

三、拷贝的几种方式和局限性 (Object)

2.1 JSON.parse(JSON.stringify(obj))序列化和反序列,局限性如下
取不到值为 undefined 的 key
如果对象里有函数,函数无法被拷贝下来
无法拷贝对象原型链上的属性和方法
2.2 使用拓展运算符+解构赋值 ,局限性如下
当值为undefined、function、symbol会在转换过程中被忽略
2.3 Object.assign()方法合并对象 ,局限性如下
当对象只有一级属性为深拷贝 当对象中有多级属性时,二级属性后就是浅拷贝
2.4 通过 循环 遍历对象
2.5 以上几种方法的局限性 可以迭代为循环递归函数避免
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值