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...