深拷貝的實現方式


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()實現深拷貝

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM