js淺拷貝 深拷貝

2021-10-20 18:11:49 字數 1436 閱讀 3138

1. 概述

淺拷貝只是拷貝一層,針對於更深層次的物件級別的資料,只是拷貝引用,因此拷貝之後再修改物件資料時,會把原來的資料一併進行修改操作。

深拷貝拷貝多層,每一級別的資料都會拷貝,而物件級別的資料則會另開闢的空間

2. 淺拷貝

es6新增方法實現淺拷貝:object.assign(target,…sources)

js實現淺拷貝

var o =};

var ob =

;for

(var k in o)

console.

log(ob)

; ob.mes.uname =

'iii'

; console.

log(o)

;

解釋:對於普通資料型別,直接賦值,但是對於複雜的物件級別的資料,拷貝引用,也即共用同乙個空間,而例題中又對物件級別資料進行了修改,因此原資料中的物件級別的資料也會被進一步的跟著修改

結果:

可以發現:列印ob和列印o分別在重新賦值前後,理應不一樣,但是列印結果卻是一樣的。原因:觀察時間不一樣,開啟開發者工具,進行斷點除錯

可以發現列印結果如下:

出現上述原因的主要在於:觀察時間不一樣,列印mes的時候是花了一定的時間去尋找位址並列印相關的資料,而如果在第乙個列印處新增斷點,實則等待了第乙個查詢位址並列印,因此內容為賦值之前的內容。

3. 深拷貝

js實現深拷貝

function

deepcopy

(newobj,oldobj)

else

if(item instanceof

object);

deepcopy

(newobj[k]

,item);}

else}}

var o =

}var ob =

;deepcopy

(ob,o)

; console.

log(ob)

; ob.mes.uname =

'iii'

;// 此時不會影響另乙個物件中的值

console.

log(o)

;

js淺拷貝深拷貝

js淺拷貝深拷貝 對於想要複製的物件,如果物件裡面對應的值都是基本資料型別的,可以直接複製 也就是通過淺拷貝複製。如果對應的值有物件那麼淺拷貝是行不通的。會造成資料汙染。下面介紹淺拷貝與深拷貝實現方法。1.淺拷貝 let tem let copy for let key in tem 2.通過obj...

淺拷貝,深拷貝 js

堆和棧 基本型別 存放在棧中的簡單資料段,資料大小確定,記憶體空間大小可以分配。6種基本資料型別 undefined null boolean number和string,es6新增屬性symbol.他們是直接按值存放的,所以可以直接訪問。引用型別 存放在堆記憶體中的物件,變數實際儲存的是乙個指標,...

JS淺拷貝 深拷貝

1,前景提要 1 數字在被複製後,再修改時,不會改變原值 var a 5 var b a b 7 console.log a a不變 2 物件在被複製後,再修改時,會改變原值 var a var b a b.name hi console.log a a.name hi 2,淺拷貝 拷貝一層物件。深...