摘要:深拷貝和淺拷貝的區(qū)別背景最近在用框架寫頁(yè)面,賦值給中的對(duì)象時(shí)會(huì)出現(xiàn)一個(gè)問(wèn)題,賦值和被賦值對(duì)象之中任何一個(gè)有變化,另一個(gè)也會(huì)隨之變化。
深拷貝和淺拷貝的區(qū)別
背景:
最近在用vue框架寫頁(yè)面,賦值給Vue.$data中的對(duì)象時(shí)會(huì)出現(xiàn)一個(gè)問(wèn)題,賦值和被賦值對(duì)象之中任何一個(gè)有變化,另一個(gè)也會(huì)隨之變化。
例如:
var b = { foo: 123 }; var vm = new Vue({ el: "#demo", data: { a: b } }); var b.foo = 456; console.log(a.foo); //輸出456 var a.foo = 789; console.log(b.foo); //輸出789
遇到問(wèn)題之后在網(wǎng)上查原因才了解到j(luò)s有深拷貝和淺拷貝的區(qū)別,提到這個(gè),又不得不提js中的兩種變量類型,即值類型(數(shù)值、布爾值、null、undefined)和引用類型(對(duì)象、數(shù)組、函數(shù))。值類型保存于棧中,而引用類型保存在堆中。說(shuō)到這,又得說(shuō)下值類型和引用類型賦值時(shí)的不同,值類型賦值時(shí)會(huì)在內(nèi)存中開(kāi)辟一塊新的空間,然后把賦過(guò)來(lái)的值保存于這塊新開(kāi)辟的空間中,引用類型賦值時(shí)也會(huì)開(kāi)辟一塊新的空間,不同的時(shí)新的空間保存的是賦值對(duì)象雖在的地址(即淺拷貝,也就是說(shuō)賦值和被賦值對(duì)象引用的是同一個(gè)對(duì)象,所以改變其中任何一個(gè)對(duì)象時(shí),另一個(gè)會(huì)隨之改變)。所以深拷貝和淺拷貝概念只針對(duì)于引用類型,對(duì)于值類型來(lái)說(shuō)沒(méi)有意義。
但在編寫程序時(shí),往往需要被賦值的對(duì)象生成一個(gè)新的對(duì)象,而不是賦值對(duì)象的一個(gè)引用,這個(gè)時(shí)候我們就需要使用深拷貝了。下面是javascript|MDN上的一個(gè)例子,里面分別描述了淺拷貝和深拷貝及其的實(shí)現(xiàn)方法。
function test() { "use strict"; // 淺拷貝 let obj1 = { a: 0 , b: { c: 0}}; let obj2 = Object.assign({}, obj1); console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}} obj1.a = 1; console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}} console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}} obj2.a = 2; console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}} console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}} obj2.b.c = 3; console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}} console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}} // 深拷貝 obj1 = { a: 0 , b: { c: 0}}; let obj3 = JSON.parse(JSON.stringify(obj1)); obj1.a = 4; obj1.b.c = 4; console.log(JSON.stringify(obj3)); // { a: 0, b: { c: 0}} }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/89153.html
摘要:本文解釋中深拷貝和淺拷貝的區(qū)別。深拷貝深拷貝指遞歸的復(fù)制對(duì)象的屬性給新對(duì)象。有些時(shí)候一層的深拷貝被認(rèn)為是淺拷貝,比如的值是一個(gè)對(duì)象,淺拷貝出來(lái)的新對(duì)象直接引用了原對(duì)象的對(duì)象,所以也會(huì)相互影響的。 本文解釋javascript中深拷貝和淺拷貝的區(qū)別。 淺拷貝/Shallow Copy 淺拷貝指拷貝了引用值。 var original = {prop1 : Prop1, prop2 : p...
摘要:接下來(lái)就讓我們更細(xì)致的探究中的深淺拷貝。總結(jié)以上對(duì)深拷貝和淺拷貝做了簡(jiǎn)單的介紹,在深拷貝的實(shí)現(xiàn)上也只介紹了最簡(jiǎn)單的實(shí)現(xiàn)形式,并未考慮復(fù)雜情況以及相應(yīng)優(yōu)化,想要對(duì)深拷貝有更深入的了解,需要大家花時(shí)間去深入研究,或者可以關(guān)注我后續(xù)文章的動(dòng)態(tài)。 對(duì)象和數(shù)組的拷貝對(duì)我來(lái)說(shuō)一直都是一個(gè)比較模糊的概念,一直有點(diǎn)一知半解,但是在實(shí)際工作中又偶爾會(huì)涉及到,有時(shí)候還會(huì)一不小心掉坑里,不知道大家有沒(méi)有同樣...
摘要:對(duì)于而言,情況可能會(huì)有點(diǎn)小復(fù)雜,因?yàn)橐磺薪詾閷?duì)象,所以的普通賦值深拷貝和淺拷貝之間都是有細(xì)微區(qū)別的。二下的他們?cè)谥校瑢?duì)象的賦值和傳遞都是引用。 一、深拷貝與淺拷貝 ??深拷貝:賦值時(shí)值完全復(fù)制,完全的copy,對(duì)其中一個(gè)作出改變,不會(huì)影響另一個(gè) ??淺拷貝:賦值時(shí),引用賦值,相當(dāng)于取了一個(gè)別名。對(duì)其中一個(gè)修改,會(huì)影響另一個(gè) ??對(duì)于PHP而言,= 賦值時(shí),普通對(duì)象是深拷貝,但對(duì)對(duì)象來(lái)說(shuō)...
摘要:對(duì)于而言,情況可能會(huì)有點(diǎn)小復(fù)雜,因?yàn)橐磺薪詾閷?duì)象,所以的普通賦值深拷貝和淺拷貝之間都是有細(xì)微區(qū)別的。二下的他們?cè)谥校瑢?duì)象的賦值和傳遞都是引用。 一、深拷貝與淺拷貝 ??深拷貝:賦值時(shí)值完全復(fù)制,完全的copy,對(duì)其中一個(gè)作出改變,不會(huì)影響另一個(gè) ??淺拷貝:賦值時(shí),引用賦值,相當(dāng)于取了一個(gè)別名。對(duì)其中一個(gè)修改,會(huì)影響另一個(gè) ??對(duì)于PHP而言,= 賦值時(shí),普通對(duì)象是深拷貝,但對(duì)對(duì)象來(lái)說(shuō)...
摘要:淺拷貝與深拷貝一數(shù)據(jù)類型數(shù)據(jù)分為基本數(shù)據(jù)類型,和對(duì)象數(shù)據(jù)類型。淺拷貝是按位拷貝對(duì)象,它會(huì)創(chuàng)建一個(gè)新對(duì)象,這個(gè)對(duì)象有著原始對(duì)象屬性值的一份精確拷貝。對(duì)于字符串?dāng)?shù)字及布爾值來(lái)說(shuō)不是或者對(duì)象,會(huì)拷貝這些值到新的數(shù)組里。 淺拷貝與深拷貝 一、數(shù)據(jù)類型數(shù)據(jù)分為基本數(shù)據(jù)類型(String, Number, Boolean, Null, Undefined,Symbol)和對(duì)象數(shù)據(jù)類型。 基本數(shù)據(jù)類...
閱讀 2633·2021-11-25 09:43
閱讀 2735·2021-11-04 16:09
閱讀 1652·2021-10-12 10:13
閱讀 889·2021-09-29 09:35
閱讀 887·2021-08-03 14:03
閱讀 1781·2019-08-30 15:55
閱讀 2997·2019-08-28 18:14
閱讀 3498·2019-08-26 13:43