首页 > 代码库 > 递归 深拷贝

递归 深拷贝

// 递归深拷贝!
    function clone(Obj) {
        var newObj;   
        if (Obj instanceof Array) {
            newObj = [];  // 创建一个空的数组
            var i = Obj.length;
            while (i--) {
                newObj[i] = clone(Obj[i]);
            }
            return newObj;
        } else if (Obj instanceof Object){
            newObj = {};  // 创建一个空对象
            for (var k in Obj) {  // 为这个对象添加新的属性
                newObj[k] = clone(Obj[k]);
            }
            return newObj;
        }else{
            return Obj;
        }
    }

当你想复制一个对象或者一个数组时,如何做到互不影响,而且可以做到深拷贝呢,我们先来说说深拷贝和浅拷贝吧

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

var obj = { a:1, arr: [9,10] };
var reObj = Copy(obj);

function Copy(src) {
  var dst = {};
  for (var prop in src) {
    if (src.hasOwnProperty(prop)) {
      dst[prop] = src[prop];
    }
  }
  return dst;
}

上面是一个简单的浅复制实现,因为浅复制只会将对象的各个属性进行依次复制,并不会进行递归复制,而 JavaScript 存储对象都是存地址的,所以浅复制会导致 obj.arr 和 reObj.arr 指向同一块内存地址。

再来看看刚开篇时的代码,首先确定类型,然后确定递归的回调,最终到达对象或者数组的末端,达到深拷贝的要求。

递归 深拷贝