如何實現深拷貝和淺拷貝?
拷貝:其實就是一個物件複製給另外一整個物件,讓物件相互不影響。
物件的拷貝又分為淺拷貝和深拷貝:物件的淺拷貝(只拷貝一層)
物件的深拷貝(拷貝多層)
淺拷貝和深拷貝只針對object和Array這樣的複雜的物件
所謂的淺拷貝,只是拷貝了基本型別的資料,對於引用的型別資料,複製後也是會發生引用,這種拷貝就叫做淺拷貝
而深拷貝,要求要複製一個複雜的物件,這就可以利用遞迴的思想來實現,省效能又不會發生引用,它不僅將原物件的各個屬性逐個複製出去,而且將原物件各個屬性所包含的物件也依次採用深複製的方法遞迴複製到新物件上。這就不會存在上面 obj 和 shallowObj 的 arr 屬性指向同一個物件的問題。
var a = { name : “hello” };
實現淺拷貝
1、ES6:object.assign()
var a = { name : “hello” };
var b = Object.assign( { },a );
b.name = “hi”;
console.log(a);
2、展開運算子……
var a = { name : “hello” };
var b = { …a}; => 擴充套件運算子用三個點號表示,功能是把陣列或類陣列物件展開成一系列用逗號隔開的值
b.name = “hi”;
console.log(a);
3、自己封裝函式實現for in
var a = { name : “hello” };
var b = copy(a);
b.name = ‘hi’;
console.log(a);
function copy(obj){
var result = { };
for(var attr in obj ){
result [attr] = obj[attr];
}
return result;
}
實現深拷貝
JS實現深拷貝則可以應用JSON.parse()JSON.Stringify()的方法
物件自變數和JSON的區別
1物件自變數是物件的操作 可以又方法和屬性JSON資料的格式。規定資料的操作
2JSON只能寫基本型別的數但是還有JSON
3JSON要求屬性(key)和值都必須新增雙引號
深拷貝實現
1、var a = {name = {age:20}};
var b = JSON.parse(JSON.Stringify(a));
b.name.age =30;
console.log(a);
必須針對物件JSON這樣的深拷貝是有侷限性的
2、已封裝函式與實現for in +遞迴
var a = {name : {age : 20}};
var b =deepcopy(a);
b.name.age = 30 ;
console.log(a);
function deepcopy (obj){
var result = { };
for(var attr in obj){}
if(type of obj[attr] === ‘object’){
result [attr] = deepcopy(obj[attr]);
}
else{
result[attr] = obj[attr];
}
}
Return result;
}
之所以會出現了深拷貝和淺拷貝,究其根本是因為JS種的變數包含了不同型別的資料值:基本型別和引用型別;同時其中變數的儲存方式也不用Object屬於堆記憶體的儲存方式;並且JS的值的傳遞方式如值傳遞和址傳遞的會出現不同,所以才會出現這一系列的問題,因此才會使用深拷貝和淺拷貝來解決這些問題。
其實對於javascript的深拷貝和淺拷貝的方法還有很多,這裡只是介紹了常見的幾種方式。
來源:千鋒HTML5