JavaScript(JS)手写实现深拷贝

这是一道较为经典的面试题了,算是一道考研基本功的算法题,希望你在看本文章之前已经对于递归这一思想有了了解。

先上代码

function deepCopy(item) {
    let obj = null;
    if (Array.isArray(item)) {
        obj = [];
    } else if (typeof item == "object") {
        obj = {};
    } else {
        return item;
    }
    for (let key in item) {
        obj[key] = deepCopy(item[key]);
    }
    return obj;
}

为什么要深拷贝?

先看看直接赋值遇到的问题:

 这是因为引用类型的数据赋值给变量的其实是它在内存中的地址值,而你直接obj2 = obj1,就是把obj1这个对象的地址值给了obj2,所以obj2其实就是obj1。你改了obj2里的属性,就等于改了obj1里的。

解析

假设现在我们要把下面的 obj1 拷贝给一个变量 obj2

let obj1 = {
    name:'mikaisa',
    location:{
        city:'苏州'
    }
}

那么要实现深拷贝,那就要把目标对象里的每一个属性以及对应的值拿到,再添加到obj2身上,其中如果obj1身上有嵌套的对象比如obj1.location,那就要对这个location再次遍历,拿到里面的每一个属性以及对应的值,同样再赋值给obj2.location,最终的代码如下:

function deepCopy(item) {
    //首先初始化一个obj用来返回,因为我们的深拷贝函数就是返回拷贝好的对象
    let obj = null;

    //如果传进来的是对象那就obj赋值为{},为数组就赋值为[],为基本类型直接把它return即可
    if (Array.isArray(item)) {
        obj = [];
    } else if (typeof item == "object") {
        obj = {};
    } else {
        return item;
    }

    /*
        使用for in循环,递归调用deepCopy()
        item[key]若为基本数据类型,则会直接被递归时的deepCopy()给return回来。
        item[key]若为引用数据类型,则会再次进入for in循环递归调用deepCopy()
    */
    for (let key in item) {
        obj[key] = deepCopy(item[key]);
    }
    return obj;
}

来看看效果吧: 

 好了,以上就是本文的全部内容了,觉得不错的还请点赞收藏加关注呀!我是努力冲击大厂的小韩。

个人其他平台账号

知乎: Mikaisa,Mikaisa - 知乎

gitee码云: @mikaisazzz,MikaisaZzz-Gitee.com

CSDN: Mikaisa, Mikaisa_CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值