标签:pre 开篇 object return 实现 asc else class array
// 递归深拷贝! 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 指向同一块内存地址。
再来看看刚开篇时的代码,首先确定类型,然后确定递归的回调,最终到达对象或者数组的末端,达到深拷贝的要求。
标签:pre 开篇 object return 实现 asc else class array
原文地址:http://www.cnblogs.com/hzhj/p/6476728.html