如何实现一个深拷贝?

目录

一、基本概念

二、实现方法

1.扩展运算符

2.JSON.parse(JSON.stringify())

3.利用递归函数实现


一、基本概念

        深拷贝就是完全拷贝一份新的对象,会在堆内存中开辟一份新的空间,拷贝的对象被修改后,原对象不会受到影响,主要针对的是引用数据类型。

二、实现方法

1.扩展运算符

let obj = {
    name:张三,
    age:18
}

let obj1 = {...obj}
obj1.name = '王五'

console.log(obj)    
//{name:'张三' , age:18}
console.log(obj1)  
//{name:'王五' , age:18}

        缺点:这个方法只能针对第一层拷贝,当有多层的数据内容时实际上执行的还是浅拷贝。

2.JSON.parse(JSON.stringify())

let obj = {
    name:张三,
    age:18,
    say(){
        console.log('我执行了')
    }
}

let obj1 = JSON.parse(JSON.stringify(obj))
obj1.name = '王五'

console.log(obj)       //{name:'张三' , age:18}
console.log(obj1)      //{name:'王五' , age:18}

        缺点:该方法并不会拷贝内部函数。

        JSON.parse():将JSON格式的字符串转换为JavaScript对象。

        JSON.stringify():将 JavaScript 对象或值转换为 JSON 字符串。

3.利用递归函数实现

let origin = {
    name:张三,
    age:18,
    say(){
        console.log('我执行了')
    },
    arr:[[1,2],3,4,5]
}

function exten(origin,deep){
    let obj = {}
    if(origin instanceof Array){
        obj = []
    }
    for(let key in origin){
        let value = origin[key]
        obj[key] = (!!deep && typeof value === 'object' && value !== null) ? exten(value,deep) : value
    }
    return obj
}

//测试
const ooo = exten(origin,true)
obj.arr[0].push(888)
console.log(origin)
console.log(ooo)

        这段代码它首先定义了一个名为origin的对象,然后定义了一个名为 exten 的函数,该函数接受两个参数:origin 和 deep。origin 是要深度扩展(或复制)的对象,而 deep 参数用于确定是否进行深度复制。

        在 exten 函数中,首先创建一个空对象 obj 。然后检查 origin 是否为数组,如果是,将 obj 设置为空数组。

        接下来函数使用一个 for...in 循环遍历 origin 对象的每个属性。对于每个属性,它获取该属性的值(let value = origin[key]),并检查这个值是否为非null的object类型。如果 deep 是true并且该属性的值是object类型,那么它会递归调用 exten 函数来深度复制该属性值,否则,它只是将属性值复制到新的对象中。

        在所有属性都被处理之后,该函数返回新的对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值