JS深拷貝遞歸實現


方法1.要提前聲明一個對象

var A = {
    name: "martin",
    data: {
      num: 10
    },
    arr:[1,2,3],
    say: function () {
      console.log("say");
    },
    null:{}
  };
  var B = {};
  //遞歸賦值
  function deepCopy(A, B) {
    for (item in A) { //for in……如果遍歷數組則會返回下標,如果遍歷對象則返回屬性Key值,所以數組下A[item]是一個值,對象B[item]是value值
      if ((typeof A[item]) == "object" || (typeof A[item]) == "Array") {
        B[item] = A[item].constructor === Array ? [] : {}//js的每個對象constructor指向它的構造函數
        deepCopy(A[item], B[item]);
      } else {
        B[item] = A[item]; //基本數據賦值過程相當於深拷貝
      }
    }
  }
  deepCopy(A, B);

方法二:直接返回一個深拷貝的對象

function deepClone(source){
  //js的每個對象constructor指向它的構造函數
  const targetObj = source.constructor === Array ? [] : {}; // 判斷復制的目標是數組還是對象
  for(let keys in source){ // 遍歷目標
    if(source.hasOwnProperty(keys)){//判斷屬性是否是自有的,而非繼承而來的
      if(source[keys] && typeof source[keys] === 'object'){ // 如果值是對象,就遞歸一下
        targetObj[keys] = source[keys].constructor === Array ? [] : {};
        targetObj[keys] = deepClone(source[keys]);
      }else{ // 如果不是,就直接賦值
        targetObj[keys] = source[keys];
      }
    }
  }
  return targetObj;
}

 


免責聲明!

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



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