实现深克隆的方法 (数组/对象)

117 阅读1分钟
  1. 运用扩展运算符
数组:
    let a1 = [1,2,3];
    let a2 = [...a1];
    console.log(a2); // [1,2,3]
    a2[1] = 4;
    console.log(a1); // [1,2,3]
    console.log(a2); // [1,4,3]
对象:
    let a1 = {
        name:'zs',
        age:18
    };
    let a2 = {...a1};
    console.log(a2); // {name:'zs',age:18}
    a2.age = 4;
    console.log(a1);  // {name:'zs',age:18}
    console.log(a2);  // {name:'zs',age:4}
  1. 先通过JSON.stringify 把对象类型转成字符串类型再通过JSON.parse 把字符串转成对象
    var obj = {
      name: 'zs',
      age: 18
    } 
    var obj1 = JSON.stringify(obj); //“{name: 'zs',age: 18}”
    obj1 = JSON.parse(obj2)
    obj1.age = 4;
    console.log(obj) //{name: 'zs',age: 18}
    console.log(obj1) //{name: 'zs',age: 4}
  1. 封装深克隆方法(转换成基本数据类型)
    
    function deepclone(params) {
       var tmp
       for(var key in params){
            if(typeof params === 'object'){ //判断是否是引用数据类型
                tmp=typeof Array.isArray() ? [] : {} //定义空的数组\对象
                if(typeof params[key]==='object'){ //判断引用数据类型中是否还存在引用数据类型
                    tmp[key] = deepclone(params[key]) //若其自身存在引用数据类型则递归调用它自己
                }else{
                    tmp[key]=params[key] //若其自身不存在引用数据类型则令空数组\对象中的每一项为输入的数组\对象中的每一项的值value(此时value均为基本数据类型)
                }
            }else{
                tmp=obj//若不是引用数据类型则直接令空数组\对象等于其自身
            }   
        } 
       return tmp
    }  
数组类型
    var arry1=[1,2,3]
    var arry2=deepclone(arry1)
    arry2[0]=4
    console.log(arry1)  //[1,2,3]
    console.log(arry2)  //[4,2,3]
对象类型 
    var obj={
        name:'zs',
        age:18,
        info:{
            weight:'100',
            height:'165'
        }
    } 

    var o1=deepclone(obj)
    o1.info.weight='80'
    console.log(obj)  //{name:'zs',age:18,info:{weight:'100',height:'165'}} 
    console.log(o1)  ////{name:'zs',age:18,info:{weight:'80',height:'165'}} 
  1. 对象合并 浅拷贝
 let obj3 = Object.assign(obj1, obj2)

转换为深拷贝(加一个空数组)

let obj4 = Object.assign({},obj1, obj2)