深拷貝和淺拷貝的區別
阿新 • • 發佈:2018-04-03
log birt 並且 ace UNC 分享 一個 eof 發生
深拷貝和淺拷貝的區別
深拷貝和淺拷貝最根本的區別在於是否真正獲取一個對象的復制實體,和不是引用。
簡單來說
淺拷貝(shallowCopy)只是增加了一個指針指向已存在的內存地址,
深拷貝(deepCopy)是增加了一個指針並且申請了一個新的內存,使這個增加的指針指向這個新的內存,
使用深拷貝的情況下,釋放內存的時候不會因為出現淺拷貝時釋放同一個內存的錯誤。
淺復制:僅僅是指向被復制的內存地址,如果原地址發生改變,那麽淺復制出來的對象也會相應的改變。
深復制:在計算機中開辟一塊新的內存地址用於存放復制的對象。
淺拷貝實例:
//此遞歸方法不包含數組對象 var obj = { a:1, arr: [2,3] };var shallowObj = shallowCopy(obj); function shallowCopy(src) { var newobj = {}; for (var prop in src) { if (src.hasOwnProperty(prop)) { newobj[prop] = src[prop]; } } return newobj; }
因為淺復制只會將對象的各個屬性進行復制,並不會進行遞歸復制,而JavaScript存儲對象是存地址的,所以淺復制會導致Obj.arr和shallowObj.arr指向同一塊內存地址:
導致的結果就是:
shallowObj.arr[1] = 5; console.log(obj.arr[1]); //5
深拷貝實例:
var obj = { a:1, arr: [1,2], nation : ‘中國‘, birthplaces:[‘北京‘,‘上海‘,‘廣州‘] }; var obj2 = {name:‘楊‘}; obj2 = deepCopy(obj,obj2); console.log(obj2); //深復制,要想達到深復制就需要用遞歸 function deepCopy(o, c){ var c = c || {};for(var i in o){ if(typeof o[i] === ‘object‘){ if(o[i].constructor === Array){ //這是數組 c[i] = []; }else{ //這是對象 c[i] = {}; } deepCopy(o[i], c[i]); }else{ c[i] = o[i]; } } return c; }
而深復制則不同,它不僅將原對象的各個屬性逐個復制過去,
深拷貝和淺拷貝的區別