浅拷贝:将对象循环遍历复制到另一个对象
弊端:修改一个对象的属性,另一个对象会跟着改变
var p1 = {
name:"张三",
age:20,
gender:"男",
favs:["前端","Java","C语言"],
wife:{
name:"李四",
age:20,
gender:"女",
favs:["香奈儿","爱马仕","古驰"]
}
}
var p2 = {};
// 浅拷贝----for in 循环 将p1的每一个键值对赋值给p2
for(var k in p1){
p2[k] = p1[k];
}
p2.name = "申五";
p2.wife.age = 55;
console.log(p2);
console.log(p1);
// 会发生一改全改的情况(数据安全的问题)
深拷贝:
1、实现原理:使用JSON.parse(JSON.stringify(obj))
弊端:对象的属性值是函数时,无法拷贝;原型链上的属性无法拷贝;不能正确的处理 Date类型的数据;会忽略 undefined
2.实现原理:判断+递归
弊端:对象属性多的时候消耗的性能较大
// 深拷贝的实现原理: 保证拷贝的每一个键值对都是基本类型
/*
参数设计: 将p1拷贝到p2中 p1(当前对象cur) p2(目标对象tar)
*/
function deepCopy(cur,tar){
// 1. 遍历 cur 对象
for(var k in cur){
// 数组用for in 循环 k 是索引
// 2. for in 循环 会遍历 原型成员 --- 实例成员判断
if(cur.hasOwnProperty(k)){
// console.log(k);
// 3. 引用类型和基本类型的判断
if(typeof cur[k] ==="object"){
// 不是数组就是对象
// console.log(k);
// 4. 数组对象的判断
// tar[k] =Object.prototype.toString.call(cur[k])==="[object Array]"? []:{};
tar[k] =Array.isArray(cur[k]) ? []:{};
// 5. 递归调用-----入口
deepCopy(cur[k],tar[k]);
/*
过程:
1. deepCopy(p1,p2)
2. deepCopy(p1.favs,p2.favs)
2. deepCopy(p1.wife,p2.wife)
3. deepCopy(p1.wife.favs,p2.wife.favs)
*/
}else{ // 出口
// 基本数据类型---- 直接拷贝
tar[k] = cur[k];
}
}
}
}
deepCopy(p1,p2);