美文网首页
对象,数组深拷贝方法

对象,数组深拷贝方法

作者: 雨落倾城夏微凉_e861 | 来源:发表于2020-08-27 08:44 被阅读0次

    对于基本类型的数据我们直接重新定义变量就可以,但是对于引用类型的数据如果我们需要保持原有的数据不被更改,我们需要一些特殊的处理,让他们指向不同的地址.

    如果是简单的纯属组类型比如数组中是数字,字符串类型,可直接通过slice,concat实现深拷贝.

    如果是对象的话处理会比较麻烦,我们平时经常用的方法比如通过new Object(),Object.assign(),es6的扩展运算符等其实都是浅拷贝,他们还是指向的一个地址,改变对象中的引用类型的值,另一个也会改变.

    通过JSON.stringify()实现深拷贝

    var obj1 = {
        name: "jock",
        age: 20,
        arr: [1,2,3]
    }
    var obj2 = JSON.stringify(obj1);
    obj2 = JSON.parse(obj2);
    obj2.name = "tom";
    obj2.arr[1] = "dfy"
    console.log(obj1,obj2);
    
    1.png

    发现这种方式是可以的,但是这种方法有个弊端,就是对象中不能有方法和正则表达式.所以如果需要一个公共的方法我们需要自己通过递归实现深拷贝.

    递归实现深拷贝

    function deep(obj1,obj2){
        for(var key in obj2){
          if(typeof obj2[key] == "object"){
            obj1[key] = obj2[key].constructor == Array ? [] : {}
            deep(obj1[key], obj2[key])
          }else{
            obj1[key] = obj2[key]
          }
      }
      return obj1;
    }
    

    我们来测试一下上面的方法

    var obj3 = {
        name: "lilei", 
        age: 20,
        fuc: function(){
            console.log(10)
        },
        arr: [1,2,3,4,5,6]
    }
    var obj4 = deep({},obj3);
    obj4.age = 100;
    obj4.arr[0] = 100;
    console.log(obj3,obj4)
    
    2.png

    相关文章

      网友评论

          本文标题:对象,数组深拷贝方法

          本文链接:https://www.haomeiwen.com/subject/ukwqsktx.html