✨递归 实现深克隆 拷贝

28 篇文章 0 订阅
15 篇文章 0 订阅

我的一位好朋友在面试的时候面到了深浅克隆的问题,

浅克隆:可以直接赋值做到,但是他们引用的都是同一个地址,所以原来的改变了,浅克隆过后的数据他也回跟随其变化.

深克隆:他是直接独立出来了,克隆了一个新的出来,改变了其引用地址,所以与浅克隆相反.

我还是拿下面这个数据格式作为克隆对象 👇

它里面是有对象,有函数和数组

 const obj = {
     "childrenList": [{
         "childrenList": [{
             "childrenList": () => {
                 console.log(this)
             },
             "id": 5,
             "name": "子节点11",
             "pId": 3,
             "type": "1"
         }],
         "id": 3,
         "name": "子节点1",
         "pId": 1,
         "type": "1"
     }],
     "id": 1,
     "name": "根节点1",
     "pId": 0,
     "type": "1"
 }

话不多说,直接上代码.

    function clone(num) {
    	// 申明一个变量,不赋值,因为他有可变性
        let data;
        // 判断 是否为对象
        if (num instanceof Object) {
        // 函数是引用
            if (num instanceof Function) {
                return new Function('return '+num.toString()).call(this)
            } else if (num instanceof Array) {
            // 如果数组 递归遍历就好啦
                data = [];
                for (let v in num) {
                    data.push(clone(num[v]));
                }
            } else {
            // 同数组一样
                data = {};
                for (let v in num) {
                    data[v] = clone(num[v]);
                }
            }
        } else {
        // 基本数据类型 直接赋值就好啦
            data = num;
        }
        return data;
    }
    
    console.log(clone(obj));

以下是我深克隆之后拿到的数据 👇

在这里插入图片描述
如果对你有帮助的话麻烦点个关注吧(感谢啦)
在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小朋友120

谢谢你拉近我与星星的距离

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

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

打赏作者

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

抵扣说明:

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

余额充值