手写一个深拷贝的方法,支持所有数据类型

function deepCopy(obj) {
    // 处理基本数据类型和函数
    if (obj === null || typeof obj !== 'object') {
        return obj;
    }

    // 处理日期对象
    if (obj instanceof Date) {
        return new Date(obj.getTime());
    }

    // 处理正则表达式对象
    if (obj instanceof RegExp) {
        return new RegExp(obj);
    }

    // 处理数组
    if (Array.isArray(obj)) {
        const newArray = [];
        for (let i = 0; i < obj.length; i++) {
            newArray[i] = deepCopy(obj[i]);
        }
        return newArray;
    }

    // 处理对象
    const newObj = {};
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = deepCopy(obj[key]);
        }
    }
    return newObj;
}

// 示例用法:
const obj1 = {
    name: 'John',
    age: 30,
    address: {
        city: 'New York',
        country: 'USA'
    },
    hobbies: ['reading', 'sports']
};

const obj2 = deepCopy(obj1);

console.log(obj2); // 输出与 obj1 结构相同的对象

解释:

  1. 基本数据类型和函数的处理:

    如果 obj 是 null 或者不是对象(如基本数据类型和函数),直接返回 obj,因为它们是不可变的。
  2. 特殊对象类型的处理:

    如果 obj 是 Date 对象,通过 new Date(obj.getTime()) 复制日期。
    如果 obj 是 RegExp 对象,通过 new RegExp(obj) 复制正则表达式。
     
  3. 数组的处理:

    如果 obj 是数组,创建一个新数组 newArray,并递归地将每个元素拷贝到 newArray 中。
     
  4. 对象的处理:

    如果 obj 是普通对象,创建一个空对象 newObj,并递归地复制每个属性到 newObj 中。
     
  5. 递归调用:

    • 使用递归调用 deepCopy 方法,确保所有嵌套的对象和数组都被正确地复制。

      这个方法确保了对所有数据类型的支持,并能够完整地复制对象及其嵌套的所有属性和元素。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值