JS深度复制deepCopy

JavaScript中,深度复制用于创建原始对象的副本,避免源数据变动影响引用数据。等号赋值对于Array和Object仅作引用复制。实现深度复制可通过迭代遍历每个元素进行逐个复制,确保即使源数据变化,副本保持不变。此外,也有简洁的实现方式。

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

在JS里,除Array和Object之外的数据类型的复制可以直接通过等号=来实现,但Array和Object类型的数据通过等号只是起引用作用,指向的是同一块内存地址。当源数据改变,引用的数据也同时会发生变化。因此若要复制这两类数据类型就必须对它们里边的每一个元素都逐个进行复制,可以通过迭代实现。

let util = ( ()=> {

    // 获取数据类型
    let getType=(obj)=> {
        let type = Object.prototype.toString.call(obj);
        return /object\s(.*)]/.exec(type)[1];
    };

    let isType=(obj, type)=>{
        obj = getType(obj).toLowerCase();
        return obj === type;
    };

    return {
        isType: isType
    }

})();

// 将obj对象传入,return一个复制后的对象出来
let deepCopy = (obj1) => {

    // 若不是对象类型或是null类型,直接输出
    if (typeof obj1 !== 'object' || obj1 === null) {
        return obj1
    }

    let i;
    // 根据目标是Array类型还是object来设置目标参数的类型
    let target = util.isType(obj1, 'array') ? [] : {};
    for (i in obj1) {
        // 判断当前复制的对象是否为对象类型数据
        if (typeof obj1[i] === 'object') {

            deepCopy(obj1[i]);
        }
        target[i] = obj1[i]
    }
    return target
};

let a1={a:1};
let b1=deepCopy(a1);
console.log(b1);  //{ a: 1 }
a1.a=2;
console.log(deepCopy(a1)); //{ a: 2 }
console.log(b1); //{ a: 1 }

可以看出,当源数据发生变化时,深度复制后的数据不会随之改变。

当然也可以用简单点的方法。

let deep=(sourceObj)=>{
return JSON.parse(JSON.stringify(sourceObj))}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值