摘要:參考鏈接淺拷貝最簡單的淺拷貝就賦值。所謂的淺拷貝就是,后面的對象和前面的對象在第一層數據結構中指向同一個堆地址。但是如果前面的數據不止有一層,如此時,使用和方式實現的都是淺拷貝。深拷貝管你怎么變,互不影響。
參考鏈接:
http://www.cnblogs.com/st-les...
https://blog.csdn.net/hj7jay/...
1.最簡單的淺拷貝就賦值。
由于js中的對象都是復雜數據類型,這種數據在內存中存儲的時候,存放在堆中。當簡單賦值的時候,其實是將該對象的指針指向同一個堆地址。
簡單的數據類型存放在棧中,當對簡單的數據類型進行賦值的時候,其實就是直接在棧中新開辟一個地方專門來存儲一樣的值。
所謂的淺拷貝就是,后面的對象和前面的對象在第一層數據結構中指向同一個堆地址。但是如果前面的數據不止有一層,如:
let obj = { a: {a: "hello", b: 21} };
此時,使用Object.assign()和...Object方式實現的都是淺拷貝。
此時,第一層數據雖然指向了另一個新的堆地址,但是它內部的子對象的指針卻還是同一個地址。這種情況也屬于淺拷貝,只不過是比那種直接賦值(直接復制堆地址)的方式要深刻一些。
2.數組和對象的淺拷貝
數組的淺拷貝,有三種方式:
(1) arr1 = arr2; (2) arr2 = arr1.slice(0); (3) arr2 = arr1.concat();
對象的淺拷貝,也有3種方式:
(1) obj2 = obj1; (2) obj2 = Object.assign(obj1 ,{} ) (3) obj2 = {...obj1}深拷貝
對象的深拷貝實際上就是,將前一個對象復制一份給后面的那個對象,不管前面的那個對象中的數據結構嵌套有多深,當改變其中一個對象中的任意深度的某個值后,另一個對象中的該值不會受任何影響。
1.當對象中的所有屬性值都是簡單數據類型的時候:
function easyCopy(p) { var c = {}; for (var i in p) { c[i] = p[i]; } c.uber = p; return c; }
2.當要復制的對象中存在某個屬性的value值是對象或者數組時:
如果像上面的簡單類型那樣直接賦值,那么子對象對應的屬性實際上指向的是和被拷貝對象中子對象一樣的內存地址。因此,只要改了一個,另一個也會跟著改變。
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);
總結:
淺拷貝:你變我也變,嵌套對象變,就會跟著變。
深拷貝:管你怎么變,互不影響。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101839.html
摘要:一篇文章徹底說清的深拷貝淺拷貝這篇文章的受眾第一類業務需要急需知道如何深拷貝對象的開發者。這篇文章分享的目的更多還是希望用一篇文章整理清楚深淺拷貝的含義遞歸實現思路以及小伙伴們如果使用了這種黑科技一定要清楚這樣寫的優缺點。 一篇文章徹底說清JS的深拷貝and淺拷貝 這篇文章的受眾 第一類,業務需要,急需知道如何深拷貝JS對象的開發者。 第二類,希望扎實JS基礎,將來好去面試官前秀操作...
摘要:一篇文章徹底說清的深拷貝淺拷貝這篇文章的受眾第一類業務需要急需知道如何深拷貝對象的開發者。這篇文章分享的目的更多還是希望用一篇文章整理清楚深淺拷貝的含義遞歸實現思路以及小伙伴們如果使用了這種黑科技一定要清楚這樣寫的優缺點。 一篇文章徹底說清JS的深拷貝and淺拷貝 這篇文章的受眾 第一類,業務需要,急需知道如何深拷貝JS對象的開發者。 第二類,希望扎實JS基礎,將來好去面試官前秀操作...
摘要:一篇文章徹底說清的深拷貝淺拷貝這篇文章的受眾第一類業務需要急需知道如何深拷貝對象的開發者。這篇文章分享的目的更多還是希望用一篇文章整理清楚深淺拷貝的含義遞歸實現思路以及小伙伴們如果使用了這種黑科技一定要清楚這樣寫的優缺點。 一篇文章徹底說清JS的深拷貝and淺拷貝 這篇文章的受眾 第一類,業務需要,急需知道如何深拷貝JS對象的開發者。 第二類,希望扎實JS基礎,將來好去面試官前秀操作...
深拷貝 直接使用var newObj = object.create(oldObj),可以達到深拷貝的效果. JSON.stringify以及JSON.parsevar a = { n: {name:whatever} }; var b = JSON.parse( JSON.stringify(a) ); 用jQ實現深拷貝function clone(obj) {return $.extend(...
摘要:對于而言,情況可能會有點小復雜,因為一切皆為對象,所以的普通賦值深拷貝和淺拷貝之間都是有細微區別的。二下的他們在中,對象的賦值和傳遞都是引用。 一、深拷貝與淺拷貝 ??深拷貝:賦值時值完全復制,完全的copy,對其中一個作出改變,不會影響另一個 ??淺拷貝:賦值時,引用賦值,相當于取了一個別名。對其中一個修改,會影響另一個 ??對于PHP而言,= 賦值時,普通對象是深拷貝,但對對象來說...
閱讀 3043·2021-11-25 09:43
閱讀 1626·2021-11-24 11:15
閱讀 2359·2021-11-22 15:25
閱讀 3501·2021-11-11 16:55
閱讀 3240·2021-11-04 16:10
閱讀 2773·2021-09-14 18:02
閱讀 1685·2021-09-10 10:50
閱讀 1070·2019-08-29 15:39