复杂数据类型–传址:
浅拷贝: 只拷贝数值,不拷贝地址。 节省内存。但相互影响
let DadProto = {
name :"张三",
age:20
}
let SonProto = DadProto;
SonProto.name = "李四";
console.log(SonProto);//name: "李四" ,age: 20
console.log(DadProto);//name: "李四" ,age: 20
简单数据类型–传值:
let a = 10;
let b = a;
b = 20;
console.log(b); //20
console.log(a); //10
解决传址 相互影响的问题
深拷贝 : 数值和地址都拷贝。 内存独立,不相互影响
let DadProto = {
name :"张三",
age:20,
sex:"男",
text:undefined,
fn:function(){
console.log("哈哈");
}
}
let SonProto = JSON.parse(JSON.stringify(DadProto));
SonProto.name = "李四";
console.log(SonProto);//{name: "李四", age: 20, sex: "男"}
console.log(DadProto);//{name: "张三", age: 20, sex: "男", text: undefined, fn}
这里会返回一个新的对象,达成深拷贝的效果
但是这种方式,会丢失function 和 undefined
封装深拷贝方法
思路:传入一个对象,循环遍历对象,
把对象中的每一个值,赋值给一个新的对象,并返回。
以此达成创建新地址的目的
let obj = {
name :"张三",
age:20,
sex:"男",
text:undefined,
fn:function(){
console.log("哈哈");
},
arr:[],
obj2:{}
}
function deepCopy(obj){
let newObj = Array.isArray(obj)? []:{};
for(let key in obj){
// 判断是否是对象自身的内容,如果是,才去做深拷贝
if(obj.hasOwnProperty(key)){
//判断 是否是对象(也就是复杂数据类型)
if(typeof obj[key] === "object"){
// //如果内部依然有更深层次的对象
// //那么这里还需要按照原有步骤,再循环检测一遍
newObj[key] = deepCopy(obj[key]);
}else{//如果不是,只是简单数据类型
newObj[key] = obj[key];
}
}
}
//最后,将我们检测赋值后的新对象返回,以此达成新内存的目的
return newObj;
}
let obj2 = deepCopy(obj);
obj2.name = "李四";
console.log(obj);//{name: "张三",age: 20,sex: "男",text: undefined,fn,arr: [],obj2: {}}
console.log(obj2);//{name: "李四",age: 20,sex: "男",text: undefined,fn,arr: [],obj2: {}}
fon-in 会遍历对象和原型上和原型链的属性和方法
但是我们做深拷贝的时候,是不需要原型或者原型链上的属性和方法的