1. 程式人生 > 其它 >js深拷貝與淺拷貝

js深拷貝與淺拷貝

淺拷貝是指建立新的資料,將源物件的屬性拷貝一份。如果屬性是基本型別,拷貝的是基本型別的值;如果為引用型別,拷貝的是記憶體地址。修改物件屬性會影響原物件。

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