摘要:參考鏈接淺拷貝最簡單的淺拷貝就賦值。所謂的淺拷貝就是,后面的對象和前面的對象在第一層數(shù)據(jù)結(jié)構(gòu)中指向同一個(gè)堆地址。但是如果前面的數(shù)據(jù)不止有一層,如此時(shí),使用和方式實(shí)現(xiàn)的都是淺拷貝。深拷貝管你怎么變,互不影響。
參考鏈接:
http://www.cnblogs.com/st-les...
https://blog.csdn.net/hj7jay/...
1.最簡單的淺拷貝就賦值。
由于js中的對象都是復(fù)雜數(shù)據(jù)類型,這種數(shù)據(jù)在內(nèi)存中存儲的時(shí)候,存放在堆中。當(dāng)簡單賦值的時(shí)候,其實(shí)是將該對象的指針指向同一個(gè)堆地址。
簡單的數(shù)據(jù)類型存放在棧中,當(dāng)對簡單的數(shù)據(jù)類型進(jìn)行賦值的時(shí)候,其實(shí)就是直接在棧中新開辟一個(gè)地方專門來存儲一樣的值。
所謂的淺拷貝就是,后面的對象和前面的對象在第一層數(shù)據(jù)結(jié)構(gòu)中指向同一個(gè)堆地址。但是如果前面的數(shù)據(jù)不止有一層,如:
let obj = { a: {a: "hello", b: 21} };
此時(shí),使用Object.assign()和...Object方式實(shí)現(xiàn)的都是淺拷貝。
此時(shí),第一層數(shù)據(jù)雖然指向了另一個(gè)新的堆地址,但是它內(nèi)部的子對象的指針卻還是同一個(gè)地址。這種情況也屬于淺拷貝,只不過是比那種直接賦值(直接復(fù)制堆地址)的方式要深刻一些。
2.數(shù)組和對象的淺拷貝
數(shù)組的淺拷貝,有三種方式:
(1) arr1 = arr2; (2) arr2 = arr1.slice(0); (3) arr2 = arr1.concat();
對象的淺拷貝,也有3種方式:
(1) obj2 = obj1; (2) obj2 = Object.assign(obj1 ,{} ) (3) obj2 = {...obj1}深拷貝
對象的深拷貝實(shí)際上就是,將前一個(gè)對象復(fù)制一份給后面的那個(gè)對象,不管前面的那個(gè)對象中的數(shù)據(jù)結(jié)構(gòu)嵌套有多深,當(dāng)改變其中一個(gè)對象中的任意深度的某個(gè)值后,另一個(gè)對象中的該值不會受任何影響。
1.當(dāng)對象中的所有屬性值都是簡單數(shù)據(jù)類型的時(shí)候:
function easyCopy(p) { var c = {}; for (var i in p) { c[i] = p[i]; } c.uber = p; return c; }
2.當(dāng)要復(fù)制的對象中存在某個(gè)屬性的value值是對象或者數(shù)組時(shí):
如果像上面的簡單類型那樣直接賦值,那么子對象對應(yīng)的屬性實(shí)際上指向的是和被拷貝對象中子對象一樣的內(nèi)存地址。因此,只要改了一個(gè),另一個(gè)也會跟著改變。
function deepCopy(p, c) { let c = c || {}; for (let i in p) { if(! p.hasOwnProperty(i)){ continue; } if (typeof p[i] === "object") { c[i] = (p[i].constructor === Array) ? [] : {}; deepCopy(p[i], c[i]); } else { c[i] = p[i]; } } return c; } Parent = {name: "foo", birthPlaces: ["北京","上海","香港"]} var Child = deepCopy(Parent);
總結(jié):
淺拷貝:你變我也變,嵌套對象變,就會跟著變。
深拷貝:管你怎么變,互不影響。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101839.html
摘要:一篇文章徹底說清的深拷貝淺拷貝這篇文章的受眾第一類業(yè)務(wù)需要急需知道如何深拷貝對象的開發(fā)者。這篇文章分享的目的更多還是希望用一篇文章整理清楚深淺拷貝的含義遞歸實(shí)現(xiàn)思路以及小伙伴們?nèi)绻褂昧诉@種黑科技一定要清楚這樣寫的優(yōu)缺點(diǎn)。 一篇文章徹底說清JS的深拷貝and淺拷貝 這篇文章的受眾 第一類,業(yè)務(wù)需要,急需知道如何深拷貝JS對象的開發(fā)者。 第二類,希望扎實(shí)JS基礎(chǔ),將來好去面試官前秀操作...
摘要:一篇文章徹底說清的深拷貝淺拷貝這篇文章的受眾第一類業(yè)務(wù)需要急需知道如何深拷貝對象的開發(fā)者。這篇文章分享的目的更多還是希望用一篇文章整理清楚深淺拷貝的含義遞歸實(shí)現(xiàn)思路以及小伙伴們?nèi)绻褂昧诉@種黑科技一定要清楚這樣寫的優(yōu)缺點(diǎn)。 一篇文章徹底說清JS的深拷貝and淺拷貝 這篇文章的受眾 第一類,業(yè)務(wù)需要,急需知道如何深拷貝JS對象的開發(fā)者。 第二類,希望扎實(shí)JS基礎(chǔ),將來好去面試官前秀操作...
摘要:一篇文章徹底說清的深拷貝淺拷貝這篇文章的受眾第一類業(yè)務(wù)需要急需知道如何深拷貝對象的開發(fā)者。這篇文章分享的目的更多還是希望用一篇文章整理清楚深淺拷貝的含義遞歸實(shí)現(xiàn)思路以及小伙伴們?nèi)绻褂昧诉@種黑科技一定要清楚這樣寫的優(yōu)缺點(diǎn)。 一篇文章徹底說清JS的深拷貝and淺拷貝 這篇文章的受眾 第一類,業(yè)務(wù)需要,急需知道如何深拷貝JS對象的開發(fā)者。 第二類,希望扎實(shí)JS基礎(chǔ),將來好去面試官前秀操作...
深拷貝 直接使用var newObj = object.create(oldObj),可以達(dá)到深拷貝的效果. JSON.stringify以及JSON.parsevar a = { n: {name:whatever} }; var b = JSON.parse( JSON.stringify(a) ); 用jQ實(shí)現(xiàn)深拷貝function clone(obj) {return $.extend(...
摘要:對于而言,情況可能會有點(diǎn)小復(fù)雜,因?yàn)橐磺薪詾閷ο螅缘钠胀ㄙx值深拷貝和淺拷貝之間都是有細(xì)微區(qū)別的。二下的他們在中,對象的賦值和傳遞都是引用。 一、深拷貝與淺拷貝 ??深拷貝:賦值時(shí)值完全復(fù)制,完全的copy,對其中一個(gè)作出改變,不會影響另一個(gè) ??淺拷貝:賦值時(shí),引用賦值,相當(dāng)于取了一個(gè)別名。對其中一個(gè)修改,會影響另一個(gè) ??對于PHP而言,= 賦值時(shí),普通對象是深拷貝,但對對象來說...
閱讀 3055·2021-11-25 09:43
閱讀 1650·2021-11-24 11:15
閱讀 2371·2021-11-22 15:25
閱讀 3516·2021-11-11 16:55
閱讀 3253·2021-11-04 16:10
閱讀 2785·2021-09-14 18:02
閱讀 1697·2021-09-10 10:50
閱讀 1081·2019-08-29 15:39