淺複製與深複製
阿新 • • 發佈:2018-11-08
淺複製
舉個複製程式碼的例子:
function clone(p,s) {
var s = s || {};
for (var prop in p) {
s[prop] = p[prop];
}
return s;
}
var a = {name: ’Chen‘,age: '12', hobby: {1: 'running', 2: 'swimming'}};
var b = {};
clone(a,b);
b.hobby[1] = 'reading';
b.hobby[1] // 'reading'
c.hobby[1] // 'reading'
由上面的例子可以看出,當執行淺複製時,如果物件裡包含子物件,當我們對b物件進行修改時c物件也會受到影響,這是因為淺複製是複製引用,複製後的引用都是指向同一個物件的例項,因此彼此之間的操作會互相影響
深複製
現在我們來對淺複製的程式碼進行一下小小改動,實現深複製:
function deepClone(p,s) {
var s = s || {};
for (var prop in p) {
if (typeof p[prop] == 'object') {
s[prop] = (p[prop].constructor === Array)?[]:{};
deepClone(p[prop],s[prop]);
} else {
s[prop] = p[prop];
}
}
return s;
}
var a = {name: ’Chen‘,age: '12', hobby: {1: 'running', 2: 'swimming'}};
var b = {};
clone(a,b);
b.hobby[1] = 'reading';
b.hobby[1] // 'reading'
c.hobby[1] // 'running'
由上例子可知,深複製可以解決淺複製的弊端,對於b物件進行修改時c物件也不會受到影響,這是因為深複製不是簡單的複製引用,而是在堆中重新分配記憶體,並且把源物件例項的所有屬性都進行新建複製,以保證深複製的物件的引用圖不包含任何原有物件或物件圖上的任何物件,複製後的物件與原來的物件是完全隔離的。由深複製的定義來看,深複製要求如果源物件存在物件屬性,那麼需要進行遞迴複製,從而保證複製的物件與源物件完全隔離。