1、JSON方法實現:
//_tmp和result是相互獨立的,沒有任何聯系,有各自的存儲空間。 let deepClone = function (obj) { let _tmp = JSON.stringify(obj);//將對象轉換為json字符串形式 let result = JSON.parse(_tmp);//將轉換而來的字符串轉換為原生js對象 return result; }; let obj1 = { weiqiujaun: { age: 20, class: 1502 }, liuxiaotian: { age: 21, class: 1501 } }; let test = deepClone(obj1); console.log(test);
2、用for..in遍歷
//_tmp和result是相互獨立的,沒有任何聯系,有各自的存儲空間。 let deepClone = function (obj) { let _tmp = JSON.stringify(obj);//將對象轉換為json字符串形式 let result = JSON.parse(_tmp);//將轉換而來的字符串轉換為原生js對象 return result; }; let obj1 = { weiqiujaun: { age: 20, class: 1502 }, liuxiaotian: { age: 21, class: 1501 } }; let test = deepClone(obj1); console.log(test);
3、利用數組的Array.prototype.forEach進copy
let deepClone = function (obj) { let copy = Object.create(Object.getPrototypeOf(obj)); let propNames = Object.getOwnPropertyNames(obj); propNames.forEach(function (items) { let item = Object.getOwnPropertyDescriptor(obj, items); Object.defineProperty(copy, items, item); }); return copy; }; let testObj = { name: "weiqiujuan", sex: "girl", age: 22, favorite: "play", family: {brother: "wei", mother: "haha", father: "heihei"} } let testRes2 = deepClone(testObj); console.log(testRes2);
4、使用遞歸的方式實現深拷貝
/使用遞歸的方式實現數組、對象的深拷貝 function deepClone1(obj) { //判斷拷貝的要進行深拷貝的是數組還是對象,是數組的話進行數組拷貝,對象的話進行對象拷貝 var objClone = Array.isArray(obj) ? [] : {}; //進行深拷貝的不能為空,並且是對象或者是 if (obj && typeof obj === "object") { for (key in obj) { if (obj.hasOwnProperty(key)) { if (obj[key] && typeof obj[key] === "object") { objClone[key] = deepClone1(obj[key]); } else { objClone[key] = obj[key]; } } } } return objClone; }
5、lodash函數庫實現深拷貝
lodash很熱門的函數庫,提供了 lodash.cloneDeep()實現深拷貝