美文网首页
javascript深拷贝和浅拷贝

javascript深拷贝和浅拷贝

作者: 年轻小子 | 来源:发表于2017-08-25 10:33 被阅读0次

    首先深复制和浅复制只针对像 Object, Array 这样的复杂对象的。简单来说,浅复制只复制一层对象的属性,而深复制则递归复制了所有层级。

    一、数组的slice()和concat()方法

    var arr = [1, 2, {a: 1}]
    var arr1 = arr.slice()
    arr1[2].a = 10
    console.log(arr[2].a)    // 10
    
    var arr = [1, 2, {a: 1}];
    var arr1 = [];
    arr1 = arr1.concat(arr);
    arr1[2].a = 10;
    console.log(arr[2].a);  //10
    

    从上面的代码可以看出当改变 ‘arr1’ 中的值时,arr也随着改变,所以数组的slice()和concat()的方法为浅拷贝

    二、json的api方法

     var json = {a:12,b:5, c: {d: 90}};
     var str = JSON.stringify(json);  //这里将json内的数据转换成一个字符串存起来
     var json2 = JSON.parse(str);  //这里将字符串的内容"还原"成原来的"面目"
     json2.c.d = 100;
     console.log(json.c.d);  //输出 90
    

    可以看出json的api方法是深拷贝,但有一点需要注意,当对象中有函数的话,拷贝出来的话会是undefined, 例子如下:

     var  json = {a: 12, b: 5, c: function() { console.log(10) }}
     var str = JSON.stringify(json);
     var json2 = JSON.parse(str);
     console.log(json2.c)   //undefined  
    

    三、实现深拷贝和浅拷贝

    1、浅拷贝

         var shallowCopy = function(Obj) {
            if(typeof Obj !== 'object') {
              return
            }
            var newObj = Obj instanceof Array ? [] : {};  将新数组或新的对象初始化为空
            for(var val in Obj) {
              if(Obj.hasOwnProperty(val)){   // 判断属性是否为自身属性
                newObj[val] = Obj[val];
              }
            }
            return newObj
         }
    
       var obj = {a: 1, b: 2, c: 3}
       console.log(shallowCopy(obj))
    

    2、深拷贝

         var deepCopy = function(Obj) {
            if(typeof Obj !== 'object') {
              return
            }
            var newObj = Obj instanceof Array ? [] : {};
            for(var val in Obj) {
              if(Obj.hasOwnProperty(val)){
                newObj[val] = typeof Obj[val] === 'object' ? deepCopy(Obj[val]) : Obj[val] //递归便利数组和对象
              }
            }
            return newObj
         }
    
       var obj = {a: 1, b: 2, c: {d: 9}}
       deepCopy(obj)
    

    相关文章

      网友评论

          本文标题:javascript深拷贝和浅拷贝

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