1. 程式人生 > 程式設計 >javascript深拷貝的幾種情況總結

javascript深拷貝的幾種情況總結

在前端專案的資料處理中,on資料的拷貝是很常見的,怎麼使拷貝的雙方資料之間互不影響,這就要用到深拷貝了

深拷貝:引用資料型別中名存在棧記憶體中,值存在於堆記憶體中,但是棧記憶體會提供一個引用的地址指向堆記憶體中的值,深拷貝就是增加了一個指標並且申請了一個新的記憶體,使這個增加的指標指向這個新的記憶體。方法一:使用Object.assign(),www.cppcns.com一般用於資料型別比較簡單,層數不大於1的資料;因為Object.assign無法深層拷貝。

const strJson = {
      id:'12343231',name:'張三',age:23,inof:{
        sex:'男'
      },sjid:null,strHandle () {
        console.log('111111111');
      }
    }
    obj.name = 'lisi'
    obj.inof.sex = '女'
    console.log('obj',obj);
    console.log('strhttp://www.cppcns.com
Json',strJson);

結果:

在這裡插入圖片描述

方法二:使用JSON.parse和JSON.stringify,一般用於資料型別比較複雜的,有深層巢狀的資料;但是undefined , function, RegExp 等型別無法處理;

const strJson = {
      id:'12343231',strHandle () {
        console.log('111111111');
      }
    }
    const obj = JSON.parse(JSON.stringify(strJson))
    obj.name = 'lisi'
    obj.inof.sex = '女'
    console.log('obj',obj);
    console.log('strJson',strJson);

結果:

在這裡插入圖片描述

第三種:使用遞迴拷貝,在程式碼中處理特殊的情況。

 function copyHandle (strJson) {
      let result ;
      // 判斷是否存在
      ifFtZOhqZAbN (!strJson) return null;
      // 判斷是否是物件
      if (typeof strJson !== 'object') return strJson;
      // 判斷是否是陣列
      if (Array.isArray(strJson)) {
        result = [];
        for (let i of strJson) {
          result.push(copyHandle(i))
        }
      }//判斷是否是RegExp
      else if(strJson.constructor===RegExp) {
        result = strJson
      }//判斷是否是物件
      else {
  
result = {} for (let i in strJson) { result[i] = copyHandle(strJson[i]) } } // 返回結果 return result }

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注我們的更多內容!