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