js---《深拷贝,浅拷贝的实现》{递归复制所有层级的属性,通过JSON方法实现深拷贝,Object.assign(),Array.prototype.concat(),/slice()}

本文详细讲解了深浅拷贝的概念,包括浅拷贝只复制对象指针,深拷贝创建独立副本。通过递归和JSON方法展示了深拷贝的实现,并介绍了浅拷贝的几种常见方式,如Object.assign()和Array原型方法。最后对比了两者在内存管理和修改对象上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

了解深浅拷贝是什么:

浅拷贝:

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存

深拷贝:

深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

区别?

**区别:**浅拷贝只能复制第一层,想要深度拷贝的话就要用到深拷贝了

深拷贝的实现:

(1)递归复制所有层级的属性:

function deepClone(obj){
    let objClone = Array.isArray(obj)?[]:{};
    if(obj && typeof obj==="object"){
        for(key in obj){
            if(obj.hasOwnProperty(key)){
                //判断ojb子元素是否为对象,如果是,递归复制
                if(obj[key]&&typeof obj[key] ==="object"){
                    objClone[key] = deepClone(obj[key]);
                }else{
                    //如果不是,简单复制
                    objClone[key] = obj[key];
                }
            }
        }
    }
    return objClone;
}   
let a = [1,2,3,4]
let b = deepClone(a);
a[0] = 2;
console.log(a,b);	

(2)通过JSON方法实现深拷贝

利用JSON的JSON.parse()和JSON.stringify()的两个方法实现

let arr=[1,3,{username:'kode'}];
let arr2=JSON.parse(JSON.stringify(arr));
arr2[2].username='duncan';
console.log(arr,arr4)

浅拷贝的实现:

(1)Object.assign()

var obj={a:{a:'kobe',b:39}};
var intalobj=Object.assign({},obj);
initalObj.a.a='wade';
console.log(obj.a.a);

assign()方法是把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。

但是他的拷贝方式不是固定的。

使用Object.assign()只能深拷贝一级属性,二级以上的属性(引用类型)就是浅拷贝了。如上方代码:为两级

(2)Array.prototype.concat()

let arr=[1,3,{username:'kobe'}];
let arr2=arr.concat();
arr2[2].username='wade';
console.log(arr)

concat()方法用于连接两个或多个数组。
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本

(3)Array.prototype.slice()

let arr=[1,3,{username:'kobe'}];
let arr3=arr.slice();
arr3[2].username='wade';
console.log(arr)

slice(start,end):方法可从已有数组中返回选定的元素,返回一个新数组,包含从start到end(不包含该元素)的数组元素。

注意:该方法不会改变原数组,而是返回一个子数组,如果想删除数组中的一段元素,应该使用Array.splice()方法

若有疑问,及时提出哦!

小作者在持续更新中…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漠媂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值