摘要:深拷貝和淺拷貝最根本的區(qū)別在于是否是真正獲取了一個(gè)對(duì)象的復(fù)制實(shí)體,而不是引用,深拷貝在計(jì)算機(jī)中開辟了一塊內(nèi)存地址用于存放復(fù)制的對(duì)象,而淺拷貝僅僅是指向被復(fù)制的內(nèi)存地址,如果原地址中對(duì)象被改變了,那么淺拷貝出來(lái)的對(duì)象也會(huì)相應(yīng)改變。
深拷貝和淺拷貝最根本的區(qū)別在于是否是真正獲取了一個(gè)對(duì)象的復(fù)制實(shí)體,而不是引用,
深拷貝在計(jì)算機(jī)中開辟了一塊內(nèi)存地址用于存放復(fù)制的對(duì)象,
而淺拷貝僅僅是指向被復(fù)制的內(nèi)存地址,如果原地址中對(duì)象被改變了,那么淺拷貝出來(lái)的對(duì)象也會(huì)相應(yīng)改變。
深拷貝的實(shí)現(xiàn):
1.通過(guò)遞歸解決
var a={a:23,b:[1,2,3,[5]],c:{name:"南京"}}; function deepCopy(initObj,finalObj) { var obj=finalObj||{}; for(var i in initObj){ var prop = initObj[i]; // 避免相互引用對(duì)象導(dǎo)致死循環(huán),如initalObj.a = initalObj的情況 if(prop === obj) { continue; } if(typeof initObj[i]==="object"){ obj[i]=(initObj[i].constructor===Array)?[]:{}; // arguments.callee(initObj[i],obj[i]); deepCopy(initObj[i],obj[i]); }else{ obj[i]=initObj[i]; } } return obj; } var b=deepCopy(a); b["name"]="武漢"; b.c.name="長(zhǎng)江"; console.log(a); console.log(b);
2.使用Object.create
var a={a:23,b:[1,2,3,[5]],c:{name:"南京"}}; function deepCopy(initObj,finalObj) { var obj=finalObj||{}; for(var i in initObj){ var prop=initObj[i]; if(prop===obj){ continue; } if(typeof prop==="object"){ // obj[i]=prop.constructor==="Array"?[]:Object.create(prop); // obj[i]=prop.isPrototypeOf(Array)?[]:Object.create(prop); obj[i]=prop instanceof Array?[]:Object.create(prop); }else{ obj[i]=prop; } } return obj; } var b=deepCopy(a); b["name"]="武漢"; b.c.name="長(zhǎng)江"; console.log(a); console.log(b);
3.借助JSON
var a={a:23,b:[1,2,3,[5]],c:{name:"南京"},d:function () { console.log("hh"); }}; var b=JSON.parse(JSON.stringify(a)); b["name"]="武漢"; b.c.name="長(zhǎng)江"; console.log(a); console.log(b); console.log(a.d); console.log(b.d);
這種方法的缺點(diǎn)是無(wú)法復(fù)制函數(shù),再就是原型鏈沒(méi)了,對(duì)象就是object,所屬的類沒(méi)了.
4、Object.assign()處理一層的深度拷貝
var a={name:"武漢",num:[1,2,3]}; var b=Object.assign({},a); b.name="南京"; console.log(a); console.log(b);
數(shù)組的拷貝,ES6有Array.from和...兩種方法不會(huì)發(fā)生引用,js中的slice和concat
var a=[1,2]; var b=Array.from(a); b.push(3); var c=[...a]; c.push(4); var d=a.slice(0); d.push(-1); var e=a.concat([5]); console.log(a); //[1,2] console.log(b); //[1,2,3] console.log(c); //[1,2,4] console.log(d); //[1,2,-1] console.log(e); //[1,2,5]
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/94126.html
摘要:中的深拷貝與淺拷貝說(shuō)到深淺拷貝的時(shí)候就不得不說(shuō)一下中的變量類型了基本類型按值存放在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段可以直接訪問(wèn)引用類型存放在堆內(nèi)存中的對(duì)象變量保存的是一個(gè)指向存放數(shù)據(jù)位置的指針訪問(wèn)引用類型的值時(shí)首先從棧中獲取到存放該數(shù)據(jù)位置的指針然后再 JS中的深拷貝與淺拷貝 說(shuō)到深淺拷貝的時(shí)候就不得不說(shuō)一下JS中的變量類型了: 基本類型: undefined、null、boolean、numb...
摘要:什么是深拷貝淺拷貝見名知義,無(wú)論是深拷貝還是淺拷貝,都是的問(wèn)題。使用如下以上就是關(guān)于中的深拷貝與淺拷貝的知識(shí)和如何進(jìn)行深拷貝的知識(shí)了,如果有錯(cuò)或者有其他方式的話,歡迎在下面留言評(píng)論啦 前言 最近在寫項(xiàng)目的時(shí)候涉及到一些父子組件傳遞個(gè)對(duì)象或者數(shù)組通信啥的,或者是直接復(fù)制添加對(duì)象啥的,直接使用賦值的時(shí)候總會(huì)出錯(cuò)。一查原來(lái)是淺拷貝的問(wèn)題,就從網(wǎng)上找了點(diǎn)資料,匯總到這里來(lái)了。 1 什么是深拷貝...
摘要:案例中的賦值就是典型的淺拷貝,并且深拷貝與淺拷貝的概念只存在于引用類型。修改修改經(jīng)測(cè)試,也只能實(shí)現(xiàn)一維對(duì)象的深拷貝。經(jīng)過(guò)驗(yàn)證,我們發(fā)現(xiàn)提供的自有方法并不能徹底解決的深拷貝問(wèn)題。 在說(shuō)深拷貝與淺拷貝前,我們先看兩個(gè)簡(jiǎn)單的案例: //案例1 var num1 = 1, num2 = num1; console.log(num1) //1 console.log(num2) //1 num...
摘要:而引用類型值是指那些保存堆內(nèi)存中的對(duì)象,意思是變量中保存的實(shí)際上只是一個(gè)指針,這個(gè)指針指向內(nèi)存中的另一個(gè)位置,該位置保存對(duì)象。而堆內(nèi)存主要負(fù)責(zé)對(duì)象這種變量類型的存儲(chǔ)。我們需要明確一點(diǎn),深拷貝與淺拷貝的概念只存在于引用類型。 深拷貝和淺拷貝 說(shuō)起深拷貝和淺拷貝,首先我們來(lái)看兩個(gè)栗子 // 栗子1 var a = 1,b=a; console.log(a); console.log(b) ...
摘要:深拷貝淺拷貝本文主要對(duì)深拷貝淺拷貝的解釋及實(shí)現(xiàn)做一下簡(jiǎn)單記錄。之所以會(huì)有深拷貝與淺拷貝之分,是因?yàn)椴煌瑪?shù)據(jù)類型的數(shù)據(jù)在內(nèi)存中的存儲(chǔ)區(qū)域不一樣。但注意,只能做一層屬性的淺拷貝。 深拷貝VS淺拷貝 本文主要對(duì)深拷貝&淺拷貝的解釋及實(shí)現(xiàn)做一下簡(jiǎn)單記錄。原文鏈接,歡迎star。 之所以會(huì)有深拷貝與淺拷貝之分,是因?yàn)椴煌瑪?shù)據(jù)類型的數(shù)據(jù)在內(nèi)存中的存儲(chǔ)區(qū)域不一樣。 堆和棧是計(jì)算機(jī)中劃分出來(lái)用來(lái)存儲(chǔ)的...
閱讀 1705·2021-09-22 15:25
閱讀 1621·2021-09-07 10:06
閱讀 3256·2019-08-30 15:53
閱讀 1154·2019-08-29 13:12
閱讀 3459·2019-08-29 13:07
閱讀 805·2019-08-28 18:19
閱讀 2351·2019-08-27 10:57
閱讀 1044·2019-08-26 13:29