javascript深拷貝的幾種情況總結
阿新 • • 發佈:2022-01-13
在前端專案的資料處理中,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.comJson',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 }
總結
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注我們的更多內容!