前端淺拷貝和深拷貝的區別?

2021-10-16 18:21:30 字數 2200 閱讀 6075

假設b複製了a,修改a的時候,看b是否發生變化:

如果b跟著也變了,說明是淺拷貝,拿人手短!(修改堆記憶體中的同乙個值)

如果b沒有改變,說明是深拷貝,自食其力!(修改堆記憶體中的不同的值)

淺拷貝(shallowcopy)只是增加了乙個指標指向已存在的記憶體位址,

深拷貝(deepcopy)是增加了乙個指標並且申請了乙個新的記憶體,使這個增加的指標指向這個新的記憶體,

使用深拷貝的情況下,釋放記憶體的時候不會因為出現淺拷貝時釋放同乙個記憶體的錯誤。

淺拷貝例項:

//此遞迴方法不包含陣列物件

var obj =

;var shallowobj =

shallowcopy

(obj)

;function

shallowcopy

(src)

;for

(var prop in src)

}return newobj;

}

導致的結果就是:

shallowobj.arr[1]

=5;console.

log(obj.arr[1]

);//5

深拷貝例項:

var obj =

;var obj2 =

; obj2 =

deepcopy

(obj,obj2)

; console.

log(obj2)

;//深複製,要想達到深複製就需要用遞迴

function

deepcopy

(o, c)

;for

(var i in o)

else;}

deepcopy

(o[i]

, c[i]);

}else

}return c;

}

而深複製則不同,它不僅將原物件的各個屬性逐個複製出去,而且將原物件各個屬性所包含的物件也依次採用深複製的方法遞迴複製到新物件上。這就不會存在obj和shallowobj的arr屬性指向同乙個物件的問題。

這樣obj1和obj2分別擁有不同的記憶體位址,兩邊的值改變互不影響。

淺拷貝實現:

var a =[1

,2,3

,4,5

];var b = a;a[0

]=2console.

log(a)

;console.

log(b)

;

//因為b淺拷貝a, ab指向同乙個記憶體位址(堆記憶體中存的值)

//b會隨著a的變化而變化

深拷貝實現:

function

deepclone

(obj);if

(typeof obj !==

'object'

)else

}return newobj;

}

var a =[1

,2,4

,6,"a"

,"12",[

1,2]

];var b =

deepclone

(a);a[3

]=7;

console.

log(a)

;console.

log(b)

;

//b物件並沒有因為a物件的改變而改變,因為b深拷貝a[1

前端的深拷貝和淺拷貝 深拷貝與淺拷貝的區別

淺拷貝的方式 淺拷貝1 var obj var newobj obj newobj.name 李四 console.log obj console.log newobj 淺拷貝2 object.assgin 引數1 目標物件 引數2 任意多個物件 如果物件是多層的話 var obj var obj1...

前端的深拷貝和淺拷貝 前端面試 深拷貝和淺拷貝

面試題目 如何實現對乙個陣列或物件的淺拷貝和深拷貝?wtf,複製還分兩種,第一次遇到這種問題的時候很是無語呢,先來看看一般的答案的理解。淺拷貝是只拷貝一層,深層次的物件級別就只拷貝引用。深拷貝是拷貝多層,每一級別的資料都拷貝出來。也就是說,基本資料型別其實不存在深淺拷貝的問題,只有物件和陣列才存在深...

深拷貝和淺拷貝的區別

retain屬性表示兩個物件位址相同 建立乙個指標,指標拷貝 內容當然相同,這個物件的retain值 1也就是說,retain 是指標拷貝 淺拷貝 copy 是內容拷貝 深拷貝 ios中並不是所有的物件都支援copy,mutablecopy,遵守nscopying 協議的類可以傳送copy訊息,遵守...