什么是對象的拷貝?
將一個(gè)對象賦值給另外一個(gè)對象, 我們稱之為對象的拷貝什么是深拷貝, 什么是淺拷貝?
例如:將A對象賦值給B對象-
淺拷貝是指, 修改B對象的屬性和方法會影響到A對象的屬性和方法, 我們稱之為淺拷貝
function Person(name, age, dog) { this.name = name; this.age = age; this.say = function () { console.log(this.name, this.age); }; this.dog = dog; } var p1 = new Person("luodou", 13, { name: "wc", age: "3" }); // 1.對象之間的直接賦值 /* // 將p1對象賦值給p2對象 // 本質(zhì)上是p1和p2都指向了同一塊存儲空間 // 所以無論是修改p1還是p2都會影響到另外一個(gè) // 所以下列代碼是淺拷貝 var p2 = p1; console.log(p1.name); p2.name = "zq"; console.log(p1.name); */ // 2.對象屬性的逐一賦值 var p2 = new Person(); copy(p1, p2); function copy(o1, o2){ for(var key in o1){ o2[key] = o1[key]; } } console.log(p2); console.log(p1.dog.name); //wc p1.dog.name = "mm"; console.log(p1.dog.name); //mm
深拷貝是指, 修改B對象的屬性和方法不會影響到A對象的屬性和方法, 我們稱之為深拷貝
function Person(name, age, dog) {
this.name = name;
this.age = age;
this.say = function () {
console.log(this.name, this.age);
};
this.dog = dog;
}
// var p1 = new Person("lnj", 13, {
// name: "wc",
// age: "3"
// });
var p1 = new Person("lnj", 13,{
name: "wc",
age: "3"
});
/*
//若傳入的是數(shù)組也一樣懂鸵,數(shù)組也是對象
var p1 = new Person("lnj", 13,[1,3,5]);
*/
var p2 = new Person();
function deepCopy(o1, o2){
// 取出第一個(gè)對象的每一個(gè)屬性
for(var key in o1){
// 取出第一個(gè)對象當(dāng)前屬性對應(yīng)的值
var item = o1[key]; // dog
// 判斷當(dāng)前的值是否是引用類型
// 如果是引用類型, 我們就重新開辟一塊存儲空間
if(item instanceof Object){
var temp = new Object();
/*
{name: "wc",age: "3"}
*/
deepCopy(item, temp); //遞歸
o2[key] = temp;
}else{
// 基本數(shù)據(jù)類型
o2[key] = o1[key];
}
}
}
deepCopy(p1, p2);
console.log(p1.dog.name); // wc
p2.dog.name = "mm";
console.log(p1.dog.name); // wc
/*
deepCopy(p1, p2);
console.log(p1.dog); // wc
p2.dog = [2,4,6];
console.log(p2);
console.log(p1.dog); // wc
*/
- 注意點(diǎn):
默認(rèn)情況下對象之間的直接賦值都是淺拷貝
默認(rèn)情況下一個(gè)對象的屬性如果是基本數(shù)據(jù)類型, 那么都是深拷貝
如果對象的屬性包含了引用數(shù)據(jù)類型, 才真正的區(qū)分深拷貝和淺拷貝