浅拷贝:
- 基本数据类型的改变、不会影响被赋给对象的基本数据类型的改变
- 复杂数据类型的改变、会影响被赋给对象的复杂数据类型的改变
// 基本数据类型(number、string、boolean、null、undefined):obj1改变、不会影响obj2
// 复杂数据类型(function、array、object):obj1改变、会影响obj2
const obj1 = {
name: '张三',
hobbys: ['篮球', '足球', '乒乓球'],
hourse: {
price: '1000000',
color: 'pink',
floors: 3
},
say() {
console.log("----");
},
}
let obj2 = {};
function copy(o1, o2) {
for(let key in o1) {
if (o2[key]) {
continue;
}
o2[key] = o1[key];
}
return o2;
}
obj2 = copy(obj1, obj2);
obj1.name = '王五';
obj1.hobbys[0] = '羽毛球';
obj1.hourse.color= 'red';
console.log('obj1.name====>',obj1.name); // 王五
console.log('obj1.hobbys====>',obj1.hobbys); // ["羽毛球", "足球", "乒乓球"]
console.log('obj1.hourse====>',obj1.hourse); // {price: "1000000", color: "red", floors: 3}
console.log('obj2.name====>',obj2.name); // 张三
console.log('obj2.hobbys====>',obj2.hobbys); // ["羽毛球", "足球", "乒乓球"]
console.log('obj2.hourse====>',obj2.hourse); // {price: "1000000", color: "red", floors: 3}
深拷贝:
- 基本数据类型的改变、不会影响被赋给对象的基本数据类型的改变
- 复杂数据类型的改变、不会影响被赋给对象的复杂数据类型的改变
// 基本数据类型(number、string、boolean、null、undefined):obj1改变、不会影响obj2
// 复杂数据类型(function、array、object):obj1改变、不会影响obj2
const obj1 = {
name: '张三',
hobbys: ['篮球', '足球', '乒乓球'],
hourse: {
price: '1000000',
color: 'pink',
floors: 3
},
say() {
console.log("----");
},
}
let obj2 = {};
function deepCopy(o1, o2) {
for(let key in o1) {
if (o1[key] instanceof Array) {
o2[key] = [];
deepCopy(o1[key], o2[key]);
} else if (o1[key] instanceof Object) {
o2[key] = {};
deepCopy(o1[key], o2[key]);
} else if (o1[key] instanceof Function) {
o2[key]= function(){};
deepCopy(o1[key], o2[key]);
} else {
if (o2[key]) {
continue;
}
o2[key] = o1[key];
}
}
return o2;
}
obj2 = deepCopy(obj1, obj2);
obj1.name = '王五';
obj1.hobbys[0] = '羽毛球';
obj1.hourse.color= 'red';
console.log('obj1.name====>',obj1.name); // 王五
console.log('obj1.hobbys====>',obj1.hobbys); // ["羽毛球", "足球", "乒乓球"]
console.log('obj1.hourse====>',obj1.hourse); // {price: "1000000", color: "red", floors: 3}
console.log('obj2.name====>',obj2.name); // 张三
console.log('obj2.hobbys====>',obj2.hobbys); // ["篮球", "足球", "乒乓球"]
console.log('obj2.hourse====>',obj2.hourse); // {price: "1000000", color: "pink", floors: 3}