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; } } } }