javascript深拷貝的幾種情況總結(jié)
在前端項目的數(shù)據(jù)處理中,json數(shù)據(jù)的拷貝是很常見的,怎么使拷貝的雙方數(shù)據(jù)之間互不影響,這就要用到深拷貝了
深拷貝:引用數(shù)據(jù)類型中名存在棧內(nèi)存中,值存在于堆內(nèi)存中,但是棧內(nèi)存會提供一個引用的地址指向堆內(nèi)存中的值,深拷貝就是增加了一個指針并且申請了一個新的內(nèi)存,使這個增加的指針指向這個新的內(nèi)存。方法一:使用Object.assign(),一般用于數(shù)據(jù)類型比較簡單,層數(shù)不大于1的數(shù)據(jù);因為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('strJson',strJson);
結(jié)果:
方法二:使用JSON.parse和JSON.stringify,一般用于數(shù)據(jù)類型比較復雜的,有深層嵌套的數(shù)據(jù);但是undefined , function, RegExp 等類型無法處理;
const strJson = { id:'12343231', name:'張三', age:23, inof:{ sex:'男' }, sjid:null, 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);
結(jié)果:
第三種:使用遞歸拷貝,在代碼中處理特殊的情況。
function copyHandle (strJson) { let result ; // 判斷是否存在 if (!strJson) return null; // 判斷是否是對象 if (typeof strJson !== 'object') return strJson; // 判斷是否是數(shù)組 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]) } } // 返回結(jié)果 return result }
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
簡單明了區(qū)分escape、encodeURI和encodeURIComponent
這篇文章主要介紹了escape、encodeURI和encodeURIComponent的區(qū)別,需要的朋友可以參考下2018-05-05ASP.NET實現(xiàn)Repeater控件的數(shù)據(jù)綁定
這篇文章介紹了ASP.NET實現(xiàn)Repeater控件數(shù)據(jù)綁定的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07

javascript 內(nèi)置對象及常見API詳細介紹

張孝祥JavaScript學習階段性總結(jié)(2)--(X)HTML學習