JavaScript遞歸實現對象深拷貝

1.JavaScript遞歸實現對象深拷貝

JavaScript遞歸實現對象深拷貝html

function deepClone(origin,target){
            //target是否存在若是不存在建立空對象
            let tar = target || {},
            //判斷是否爲引用數據類型
                toStr = Object.prototype.toString,
                arrType='[object Array]';

            for(let key in origin){
                //剝離原型鏈的數據
                if(origin.hasOwnProperty(key)){
                    //判斷是否爲引用數據類型 對象或數組
                    if(typeof(origin[key]) === 'object' && origin[key] !== null){
                        if(toStr.call(origin[key]) === arrType ){
                            tar[key] = [];
                        }else{
                            tar[key] = {};
                        }
                        deepClone(origin[key],tar[key]);
                    }else{
                        tar[key] = origin[key];
                    }
                }
            }
            return tar;
        }

2.數組

/**
 * 輔助函數, 斷定是不是對象
 * @param obj
 * @returns {boolean}
 */
function isObj(obj) {
  return obj instanceof Object;
}
 
/**
 * 深拷貝fromObj面的全部屬性/值, 到toObj對象裏面
 * @param fromObj 拷貝對象
 * @param toObj  目標對象
 */
function deepCopyObj2NewObj(fromObj, toObj) {
  for (var key in fromObj) {
    if(fromObj.hasOwnProperty(key)){
      var fromValue = fromObj[key];
      // 若是是值類型,那麼就直接拷貝賦值
      if (!isObj(fromValue)) {
        toObj[key] = fromValue;
      } else {
        // 若是是引用類型,那麼就再調用一次這個方法,
        // 去內部拷貝這個對象的全部屬性
        // fromValue是什麼類型, 建立一個該類型的空對象
        var tmpObj = new fromValue.constructor;
 
        // console.log(tmpObj);
        // debugger;
        deepCopyObj2NewObj(fromValue, tmpObj);
        toObj[key] = tmpObj;
      }
    }
  }
}
相關文章
相關標籤/搜索