Js中的深拷貝和淺拷貝

2021-09-25 11:40:50 字數 1854 閱讀 9809

var a=10;

var b=a

// 更換值,a,b互不影響

引用型別拷貝:

var a=[10

];var b=a;b=[

20]//這裡是給b乙個新的位址

console.

log(a)

//列印結果為10

var a=[10

];var b=a;

b.push(20

)//這裡在b原有的位址上加了20

console.

log(a)

//列印結果為[10],[20]

引用型別直接複製(或賦值)稱為淺拷貝。 引用型別內部的值的賦值,與位址無關,稱為深拷貝

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

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

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

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

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

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

object.assign()//將乙個或多個原物件的屬性複製給目標物件。 用法:

var obj1=

;var obj=

;object.

assign

(obj,obj1)

;console.

log(obj)

//列印值為

obj.a=10;

console.

log(obj1)

//列印值為

var obj1=

;var obj=

;object.

assign

(obj,obj1)

;console.

log(obj)

//列印值為

obj.a.

push(2

);console.

log(obj,obj1)

//列印值為

var obj1=

;var obj2=

;var obj=

object.

assign

(obj,obj1,obj2)

console.

log(obj)

//列印值為:

var obj1=

;var obj2=

;var obj=

object.

assign

(obj,obj1,obj2)

console.

log(obj)

//列印值為:證明如果有重複的值名,後面會覆蓋前面的。

objext.

defineproperty

()定義乙個物件的屬性,這些屬性具有可配置性。

var obj=

objext.

defineproperty

(obj,'a',)

console.

log(obj)

//列印結果

var obj=

objext.

defineproperty

(obj,'a',)

console.

log(obj)

//列印結果

for(

var i in obj)

//writable:true可修改,false不可修改

//configurable:false 不可刪除,true可刪除

js 中的深拷貝和淺拷貝

對於字串型別,淺複製是對值的複製,對於物件來說,淺複製是對物件位址的複製,並沒 有開闢新的棧,也就是複製的結果是兩個物件指向同乙個位址,修改其中乙個物件的屬性,則另乙個物件的屬性也會改變,舉個栗子 var arr 1,2,3 var arrcopy arr arrcopy 0 100 修改新陣列的第...

js中的淺拷貝和深拷貝

1.概念 淺拷貝 是將乙個物件的屬性值複製到另乙個物件,如果有的屬性的值為引用型別的話,那麼會將這個引用的位址複製給物件,因此,兩個物件會有同乙個引用型別的引用,淺拷貝可以使用object.assign和展開運算子 將乙個陣列轉為用逗號分隔的引數序列 來實現。深拷貝 是將乙個物件的屬性值複製到另乙個...

JS深拷貝和淺拷貝

js中物件分為基本型別和復合 引用 型別,基本型別存放在棧記憶體,復合 引用 型別存放在堆記憶體中 堆記憶體中用於存放由new建立的物件,棧記憶體存放一些基本型別的變數和物件的引用變數 對於簡單變數,記憶體小,直接複製不會發生引用 var a 123 var b a a 123456 console...