• 对象、数组深拷贝与浅拷贝


    对象深拷贝与浅拷贝

    1、使用JSON方法
    缺点:数据类型为undefined和函数时不能进行拷贝

    let  obj1={
        a:1,
        b:[1,2,3],
        c:undefined,
        fun:()=>{}
    }
    let obj2=JSON.parse(JSON.stringify(obj1))
    obj2.a=222
    obj2.b[1]=666
    console.log(obj1,obj2)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    2、使用Object.assign
    缺点:只能深拷贝一级属性,二级属性会成为浅拷贝

    let  obj1={
        a:1,
        b:[1,2,3],
        c:undefined,
        fun:()=>{}
    }
    let obj2=Object.assign({},obj1)
    obj2.a=222
    obj2.b[1]=666
    console.log(obj1,obj2)  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    3、使用扩展运算符
    缺点:只能深拷贝一级属性,二级属性会成为浅拷贝

    let  obj1={
        a:1,
        b:[1,2,3],
        c:undefined,
        fun:()=>{}
    }
    let obj2={...obj1}
    obj2.a=222
    obj2.b[1]=666
    console.log(obj1,obj2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    4、递归(比较完美解决方案)

    function cloneDeep(data){
        let newData=Array.isArray(data)?[]:{}
        for(let key in data){
            if(data[key]&&typeof data[key]==='object'){
                newData[key]=cloneDeep(data[key])
            }else{
                newData[key]=data[key]
            }
        }
        return newData
    }
    
    let  obj1={
        a:1,
        b:[1,2,3],
        c:undefined,
        fun:()=>{}
    }
    let obj2=cloneDeep(obj1)
    obj2.a=222
    obj2.b[1]=666
    console.log(obj1,obj2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    数组深拷贝与浅拷贝

    1、使用JSON方法
    缺点:数据类型为undefined和函数时不能进行拷贝。
    2、使用Object.assign
    缺点:只能深拷贝一级属性,二级属性会成为浅拷贝。
    3、使用扩展运算符
    缺点:只能深拷贝一级属性,二级属性会成为浅拷贝。
    4、slice、concat
    缺点:只能深拷贝一级属性,二级属性会成为浅拷贝。
    5、递归(比较完美解决方案)

  • 相关阅读:
    Spring架构浅析
    低代码与AI:构建面向未来的智能化应用
    JAVASE(复习)——API(String)
    【解救ROS】ros小车机器人雷达跟随的实现步骤
    【暑期每日一题】洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here
    C# --- 坦克大战开发 --- 绘制游戏界面
    【Node.js】Express
    Zabbix钉钉报警
    MongoDB学习总览
    type和interface的异同?
  • 原文地址:https://blog.csdn.net/qq_43923146/article/details/125959478