假設b複製了a,當b變化時,如果a也變化,則為淺拷貝;如果a不變,則為深拷貝。
為什麼使用深拷貝?
在改變新的陣列或物件時,不會改變與陣列或原物件
拷貝的要求程度:是僅深拷貝第一層級的物件屬性或陣列元素還是遞迴拷貝所有層級的物件屬性和陣列元素。
深淺拷貝只針對複雜資料型別來說
深拷貝:複製物件變數時,對於非基本型別的變數,則遞迴至基本型別變數之後,再進行複製。深拷貝後的物件與原來的物件是完全隔離的,互不影響。
淺拷貝:會將物件的每個屬性進行依次複製,但是當物件的屬性值是引用型別時,實質上覆制的是其引用,當引用指向的值改變時也會跟著改變。
一、淺拷貝:
可以使用object.assign()、擴充套件運算子、slice()、concat()
陣列:法1:直接遍歷(淺拷貝)
var arr=[1,2,3,4];function copy(array)
return
newarray;
}
var copyarray=new
copy(arr);
copyarray[
0]=100
; console.log(arr);//[1, 2, 3, 4]
console.log(copyarray);//[100, 2, 3, 4]
法2:slice() ----------對於第一層級為深拷貝,第二層級以後為淺拷貝
var arr = [[1,[2,6,2]],2,3,4];var newarr =arr.slice(0
);newarr[
1]=10
;newarr[
0][1][0]=100
;//原陣列的第二層級變化
console.log(arr);
//[[1,[100,6,2]],2,3,4]
console.log(newarr);//
[[1,[100,6,2]],10,3,4]
法3:concat()-------對於第一層級為深拷貝,第二層級以後為淺拷貝
var arr=[1,2,3,4];var copyarray=arr.concat();
copyarray[
0]=100
;console.log(arr);
//[1, 2, 3, 4]
console.log(copyarray);//
[100, 2, 3, 4]
二、深拷貝:拷貝所有層級
1.不僅拷貝第一層級,還能夠拷貝陣列或物件所有層級的各項值
2. 不是單獨針對陣列或物件,而是能夠通用於陣列,物件和其他複雜的json形式的物件
法1:json.parse(json.stringify(arr));
var arr=[,,];var copyarray=json.parse(json.stringify(arr));
copyarray[
0].number=100
; console.log(arr);
//[, , ]
console.log(copyarray);//
[, , ]
缺點:它會拋棄物件的constructor,深拷貝之後,不管這個物件原來的建構函式是什麼,在深拷貝之後都會變成object,這種方法能正確處理的物件只有number、string、boolean、array,也就是說,只有可以轉成json格式的物件才可以這樣用,向function沒辦法轉成json;
法2:遞迴
var arr=[,,];function deepcopy(obj);//這裡判斷是物件還是陣列是為了判斷copy後的物件是陣列還是物件
if(obj&&typeof obj==="
object")
}else
return
newobj;
}var copyarr=deepcopy(arr);
copyarr[
0].number=100
;console.log(arr);
//[, , ]
console.log(copyarr);//
[, , ]
法3:jquery的extend()方法———預設是只對第一層級深拷貝,新增true可對所有層級深拷貝
var obj=}var obj1=$.extend(true,{},obj);
obj1.score.english=30
;console.log(obj.score.english);
//80
console.log(obj1.score.english);//
30
法4:object.assign()是深拷貝還是淺拷貝????對於第一級屬性屬於深拷貝,二級屬性以後均為淺拷貝
var obj=}var obj1=object.assign({},obj);
obj1.score.english=30
;obj1.name='an'
;
console.log(obj);//}
console.log(obj1);//
}
「淺拷貝」與「深拷貝」
c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...
淺拷貝與深拷貝
淺拷貝 1 2 myclass a,b a b 為了封裝性和解耦,同型別的兩個物件之間進行賦值操作時,所有成員變數被複製,包括私有成員 指標變數。類的成員函式在傳遞或返回物件時都會進行物件複製產生臨時物件,比如函式呼叫時實參變為形參,以及函式返回物件。考慮到效能和使用者要求不同,編譯器不複製物件內部...
「淺拷貝」與「深拷貝」
c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...