




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第JavaScript最完整的深淺拷貝實現(xiàn)方式詳解目錄基本類型拷貝數(shù)組拷貝concat()slice()對象拷貝newObject()Object.assignJSON.parse(JSON.stringify())遞歸展開運算符總結(jié)深淺拷貝:
內(nèi)存中一共分為棧內(nèi)存和堆內(nèi)存兩大區(qū)域,所謂深淺拷貝主要是對js引用類型數(shù)據(jù)進行拷貝一份,淺拷貝就是引用類型數(shù)據(jù)相互賦值之后,例obj1=obj2;如果后面的操作中修改obj1或者obj2,這個時候數(shù)據(jù)是會進行相應(yīng)的變化的,因為在內(nèi)存中引用類型數(shù)據(jù)是存儲在堆內(nèi)存中,堆內(nèi)存中存放的是引用類型的值,同時會有一個指針地址指向棧內(nèi)存,兩個引用類型數(shù)據(jù)地址一樣,如果其中一個發(fā)生變化另外一個都會有影響;而深拷貝則不會,深拷貝是會在堆內(nèi)存中重新開辟一塊空間進行存放;
簡單來說就是B復(fù)制了A,如果A發(fā)生了改變,如果B隨之變化,那么是淺拷貝,如果B并沒有發(fā)生變化,則是深拷貝。
基本類型拷貝
leta=1;
letb=a;
b=2;
console.log(a);//1
console.log(b);//2
a,b都是屬于基本類型,基本類型的復(fù)制是不會影響對方的,因為基本類型是每一次創(chuàng)建變量都會在棧內(nèi)存中開辟一塊內(nèi)存,用來存放值,所以對基本類型進行拷貝是不會對另外一個變量有影響的,屬于深拷貝。
數(shù)組拷貝
concat()slice()
//concat()
letlist=['a','b','c'];
letlist2=list.concat();
list2.push('d')
console.log(list);//['a','b','c']
console.log(list2);//['a','b','c','d']
//slice()
letlist=['a','b','c'];
letlist2=list.slice();
list2.push('d')
console.log(list);//['a','b','c']
console.log(list2);//['a','b','c','d']
上面兩種方法只能實現(xiàn)數(shù)組類型里面的單層深拷貝,如果是多層無法實現(xiàn)深拷貝。
//二維數(shù)組
letlist=['a','b','c',['d','e','f']];
letlist2=list.concat();
list2[3][0]='a';
console.log(list);
console.log(list2);
可以看到原二維數(shù)組的值也發(fā)生了變化,說明沒有實現(xiàn)深拷貝。
由此總結(jié),concat和slice只能實現(xiàn)一維數(shù)組的深拷貝,不能對多維數(shù)組進行深拷貝,所以并不是一個完美的深拷貝方式。
對象拷貝
newObject()
leta={id:1,name:'a',obj:{id:999}};
letb=newObject();
b.id=a.id;
=;
b.obj=a.obj;
='b';
a.obj.id=888;
console.log(a);
console.log(b);
更改并沒有影響到,好像可以看作深拷貝,但第二層obj里面里面的id隨之更改了,因此其實并不是深拷貝。
Object.assign
leta={id:1,name:'a',obj:{id:999}};
functionfun(obj){
leto={};
Object.assign(o,obj);
returno;
leta2=fun(a);
='a2';
a2.obj.id=888;
console.log(a);
console.log(a2);
以上兩種方法,對于一層對象都能實現(xiàn)深拷貝,但對于多層對象則無法實現(xiàn),因此也不是一種完美的深拷貝方式。
JSON.parse(JSON.stringify())
leta={
name:'a',
age:20,
obj:{id:999},
action:function(){
console.log();
letb=JSON.parse(JSON.stringify(a));
='b';
a.obj.id=888;
console.log(a);
console.log(b);
單層對象name和多層對象obj.id的改變都沒影響到原對象,因此是一個比較完美的深拷貝,但是能看到function好像并沒有被拷貝。
可以看出這個方法對于一層和多層都能實現(xiàn)深拷貝,但是這個方法的缺陷是不能拷貝Function,所以在使用時,一定要注意數(shù)據(jù)類型。
遞歸
leta={
name:'a',
skin:["red","blue","yellow",["123","456"]],
child:{
work:'none',
obj:{
id:999
action:function(){
console.log();
//封裝的遞歸方法
functioncopyWid(obj){
letnewObj=Array.isArray(obj)[]:{};
for(variinobj){
if(typeofobj[i]==='object'){//判斷是不是對象(數(shù)組或?qū)ο螅?/p>
newObj[i]=copyWid(obj[i])//遞歸解決多層拷貝
}else{
newObj[i]=obj[i]
returnnewObj;
letb=copyWid(a);
b.child.obj.id=888;
b.skin[3][0]="pink";
console.log(a);
console.log(b);
可以看到,無論是多層的對象還是多層的數(shù)組,都能實現(xiàn)深拷貝,而且能拷貝函數(shù),這個是目前來說最完美的深拷貝方法。
通過這個遞歸能實現(xiàn)一個比較完美的深拷貝,能彌補上述提到的所有方法中的缺點。
展開運算符
leta={name:'a',id:99};//如果是數(shù)組[xx,xx,xx],{...a}需要改成[...a]
letb={...a};//[...a]
a.id=88;
console.log(a);
console.log(b);
這個方法能實現(xiàn)對
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中鐵局合同范例
- 買賣貨廂合同范例
- 元器件訂貨合同范例
- 離婚協(xié)議書的生效條件
- 武漢大學(xué)自主招生自薦信成功范文
- 中外文合同范例
- 2025年餐飲業(yè)數(shù)字化服務(wù)計劃
- 互聯(lián)網(wǎng)創(chuàng)業(yè)項目立項范文
- 四川大學(xué)自主招生個人陳述自薦信的語言風(fēng)格
- 城市道路瀝青施工安全技術(shù)措施
- 部編版小學(xué)道德與法治六年級下冊《多元文化多樣魅力》
- 昆蟲的生存技巧和適應(yīng)能力
- 危急值報告制度培訓(xùn)課件
- 2022年深圳市南山區(qū)教育系統(tǒng)招聘公辦幼兒園副園長考試真題
- 鋰電池出租合同范本
- 咽喉癌病歷書寫
- DB63T 2187-2023 丹巴腮扁葉蜂監(jiān)測技術(shù)規(guī)程
- 基坑降水計算-潛水完整井-非完整井
- 幼兒園安全教育課件:《嘴巴里的小精靈》
- 幼兒園大班8的加法公開課
- 第一章-波動方程
評論
0/150
提交評論