js深拷貝與淺拷貝
阿新 • • 發佈:2021-12-14
淺拷貝是指建立新的資料,將源物件的屬性拷貝一份。如果屬性是基本型別,拷貝的是基本型別的值;如果為引用型別,拷貝的是記憶體地址。修改物件屬性會影響原物件。
1、Object.assign()
let obj1 = Object.assign ( { } , obj )
2、ES6展開運算子:
let obj={ a:1 } let obj1={ ...obj } obg1.a=2 console.log( obj1.a) // 2 console.log( obj.a) // 2
3、concat和slice陣列方法
js深拷貝的三種實現方式
深拷貝是開闢了一個新的棧,兩個物件屬性相同。將拷貝過程中遇到的引用型別都新開闢一塊地址拷貝對應的資料,對應兩個不同的地址,避免子物件共享同一份記憶體的問題了,修改一個不會影響另一個
1. 使用遞迴的方式實現深拷貝
//使用遞迴的方式實現陣列、物件的深拷貝 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; }
專案實踐:
// 物件深拷貝 export function deepClone(obj) { if (obj === null) return null; // null 的情況 if (obj instanceof RegExp) return new RegExp(obj); // 正則表示式的情況 instanceof判斷資料型別 if (obj instanceof Date) return new Date(obj); // 日期物件的情況 if (typeof obj === 'Function') return new function (obj) {}(); // 函式的情況 if (typeof obj !== 'object') { return obj; } // 因此處理陣列的情況時,可以取巧用這個辦法來new新物件 const newObj = new obj.__proto__.constructor(); for (const key in obj) { newObj[key] = deepClone(obj[key]); } return newObj; }
2. 通過 JSON 物件實現深拷貝
//通過js的內建物件JSON來進行陣列物件的深拷貝 function deepClone2(obj) { var _obj = JSON.stringify(obj), objClone = JSON.parse(_obj); return objClone; } JSON物件實現深拷貝的一些問題 *無法實現對物件中方法的深拷貝
3. 通過jQuery的extend方法實現深拷貝
let array = [1,2,3,4]; let newArray = $.extend(true,[],array);