// 遞歸深拷貝! 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 指向同一塊內存地址。
再來看看剛開篇時的代碼,首先確定類型,然后確定遞歸的回調,最終到達對象或者數組的末端,達到深拷貝的要求。
