ES6參考---對象的深度克隆


ES6參考---對象的深度克隆

一、總結

一句話總結:

先判斷類型,找出對象和數組,因為對象和數組默認值引用(也就是淺克隆),對對象和數組里面的元素再遞歸進行 對象的深度克隆 判斷
  // 深度克隆(復制)

  function getObjClass(obj) {
    let result = Object.prototype.toString.call(obj).slice(8, -1);
    if(result === 'Null'){
      return 'Null';
    }else if(result === 'Undefined'){
      return 'Undefined';
    }else {
      return result;
    }
  }
  // for in 遍歷數組的時候遍歷的是下標
  let testArr = [1,2,3,4];
  for(let i in testArr){
    console.log(i); // 對應的下標索引
  }

  // 深度克隆
  function deepClone(obj) {
    let result, objClass = getObjClass(obj);
    if(objClass === 'Object'){
      result = {};
    }else if(objClass === 'Array'){
      result = [];
    }else {
      return obj; // 如果是其他數據類型不復制,直接將數據返回
    }
    // 遍歷目標對象
    for(let key in obj){
      let value = obj[key];
      if(getObjClass(value) === "Object" || 'Array'){
        result[key] = deepClone(value);
      }else {
        result[key] = obj[key];
      }
    }
    return result;
  }
  
  
  let obj3 = {username: 'kobe',age: 39, sex: {option1: '男', option2: '女'}};
  let obj4 = deepClone(obj3);
  console.log(obj4);
  obj4.sex.option1 = '不男不女'; // 修改復制后的對象不會影響原對象
  console.log(obj4, obj3);

 

 

 

 

二、對象的深度克隆

博客對應課程的視頻位置:

 

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4   <meta charset="UTF-8">
  5   <title>對象的深度克隆</title>
  6 </head>
  7 <body>
  8 
  9 
 10 <!--
 11   1、數據類型:
 12     * 數據分為基本的數據類型(String, Number, boolean, Null, Undefined)和對象數據類型
 13     - 基本數據類型:
 14       特點: 存儲的是該對象的實際數據
 15     - 對象數據類型:
 16       特點: 存儲的是該對象在棧中引用,真實的數據存放在堆內存里
 17   2、復制數據
 18     - 基本數據類型存放的就是實際的數據,可直接復制
 19       let number2 = 2;
 20       let number1 = number2;
 21     - 克隆數據:對象/數組
 22       1、區別: 淺拷貝/深度拷貝
 23          判斷: 拷貝是否產生了新的數據還是拷貝的是數據的引用
 24          知識點:對象數據存放的是對象在棧內存的引用,直接復制的是對象的引用
 25          let obj = {username: 'kobe'}
 26          let obj1 = obj; // obj1 復制了obj在棧內存的引用
 27       2、常用的拷貝技術
 28         1). arr.concat(): 數組淺拷貝
 29         2). arr.slice(): 數組淺拷貝
 30         3). JSON.parse(JSON.stringify(arr/obj)): 數組或對象深拷貝, 但不能處理函數數據
 31         4). 淺拷貝包含函數數據的對象/數組
 32         5). 深拷貝包含函數數據的對象/數組
 33 -->
 34 <script type="text/javascript">
 35   // 復制的對象的方式
 36   // 淺度復制
 37   let obj = {username: 'kobe', age: 39, sex: {option1: '', option2: ''}};
 38   let obj1 = obj;
 39   console.log(obj1);
 40   obj1.sex.option1 = '不男不女'; // 修改復制的對象會影響原對象
 41   console.log(obj1, obj);
 42   
 43   console.log('-----------');
 44   // Object.assign();  淺復制
 45   let obj2 = {};
 46   Object.assign(obj2, obj);
 47   console.log(obj2);
 48   obj2.sex.option1 = ''; // 修改復制的對象會影響原對象
 49   console.log(obj2, obj);
 50 
 51   // 深度克隆(復制)
 52 
 53   function getObjClass(obj) {
 54     let result = Object.prototype.toString.call(obj).slice(8, -1);
 55     if(result === 'Null'){
 56       return 'Null';
 57     }else if(result === 'Undefined'){
 58       return 'Undefined';
 59     }else {
 60       return result;
 61     }
 62   }
 63   // for in 遍歷數組的時候遍歷的是下標
 64   let testArr = [1,2,3,4];
 65   for(let i in testArr){
 66     console.log(i); // 對應的下標索引
 67   }
 68 
 69   // 深度克隆
 70   function deepClone(obj) {
 71     let result, objClass = getObjClass(obj);
 72     if(objClass === 'Object'){
 73       result = {};
 74     }else if(objClass === 'Array'){
 75       result = [];
 76     }else {
 77       return obj; // 如果是其他數據類型不復制,直接將數據返回
 78     }
 79     // 遍歷目標對象
 80     for(let key in obj){
 81       let value = obj[key];
 82       if(getObjClass(value) === "Object" || 'Array'){
 83         result[key] = deepClone(value);
 84       }else {
 85         result[key] = obj[key];
 86       }
 87     }
 88     return result;
 89   }
 90   
 91   
 92   let obj3 = {username: 'kobe',age: 39, sex: {option1: '', option2: ''}};
 93   let obj4 = deepClone(obj3);
 94   console.log(obj4);
 95   obj4.sex.option1 = '不男不女'; // 修改復制后的對象不會影響原對象
 96   console.log(obj4, obj3);
 97 
 98 
 99 </script> 
100 </body>
101 </html>

 

 

 

 

 


免責聲明!

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



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