javascript深拷貝的幾種情況總結(jié)
在前端項(xiàng)目的數(shù)據(jù)處理中,json數(shù)據(jù)的拷貝是很常見的,怎么使拷貝的雙方數(shù)據(jù)之間互不影響,這就要用到深拷貝了
深拷貝:引用數(shù)據(jù)類型中名存在棧內(nèi)存中,值存在于堆內(nèi)存中,但是棧內(nèi)存會(huì)提供一個(gè)引用的地址指向堆內(nèi)存中的值,深拷貝就是增加了一個(gè)指針并且申請了一個(gè)新的內(nèi)存,使這個(gè)增加的指針指向這個(gè)新的內(nèi)存。方法一:使用Object.assign(),一般用于數(shù)據(jù)類型比較簡單,層數(shù)不大于1的數(shù)據(jù);因?yàn)镺bject.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ù)類型比較復(fù)雜的,有深層嵌套的數(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)文章
簡單掌握J(rèn)avaScript中const聲明常量與變量的用法
const和let一樣,也是ES6版本中引入的新關(guān)鍵字,下面我們就通過例子來簡單掌握J(rèn)avaScript中const關(guān)鍵詞聲明常量與變量的用法2016-05-05
怎么通過onclick事件獲取js函數(shù)返回值(代碼少)
這篇文章主要介紹了怎么通過onclick事件獲取js函數(shù)返回值,需要的朋友可以參考下2015-07-07
Javascript實(shí)例教程(19) 使用HoTMetal(5)
Javascript實(shí)例教程(19) 使用HoTMetal(5)...2006-12-12
Javascript入門學(xué)習(xí)第六篇 js DOM編程
上篇文章納悶的問題,將在這章和以后的幾章里,慢慢搞定。 從今天起,開始學(xué)習(xí)DOM編程 讓我們慢慢稱為一名初級的js程序員。 然后往js匠人方向發(fā)展。2008-07-07
js取0-9隨機(jī)取4個(gè)數(shù)不重復(fù)的數(shù)字代碼實(shí)例
這篇文章主要介紹了js取0-9隨機(jī)取4個(gè)數(shù)不重復(fù)的數(shù)字,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
盤點(diǎn)30個(gè)經(jīng)典常用的JavaScript知識(shí)點(diǎn)
這篇文章主要介紹了盤點(diǎn)30個(gè)經(jīng)典常用的JavaScript知識(shí)點(diǎn),為大家總結(jié)一篇日常經(jīng)常使用可能還不知道的點(diǎn),需要的朋友可以參考下2023-04-04
淺談Web頁面向后臺(tái)提交數(shù)據(jù)的方式和選擇
下面小編就為大家?guī)硪黄獪\談Web頁面向后臺(tái)提交數(shù)據(jù)的方式和選擇。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09

