遞歸 深拷貝


// 遞歸深拷貝!
    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 指向同一塊內存地址。

再來看看剛開篇時的代碼,首先確定類型,然后確定遞歸的回調,最終到達對象或者數組的末端,達到深拷貝的要求。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM