浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用(只将地址拷贝给了新对象)
//浅拷贝的实现方法一:
var obj={
id:1,
name: 'jason',
msg:{// 浅拷贝遇到对象级别的数据,只是将地址拷贝过去
age:18
}
};
var o={};
for(var k in obj){
// k是属性名 obj[k] 属性值
o[k] = obj[k];
}
console.log(o);
o.msg.age=20;
console.log(obj);//age:20
//es6方法拷贝方法二:
var obj={
id:1,
name: 'jason',
msg:{// 浅拷贝遇到对象级别的数据,只是将地址拷贝过去
age:18
}
};
var o={};
Object.assign(o,obj); //Object.assign(要拷贝给谁,要拷贝哪一个对象)
console.log(o);
o.msg.age=20;
console.log(obj);//age:20
深拷贝拷贝多层,每一级别的数据都会拷贝
新复制一个空间,将拷贝完的空间给新对象,这样两者互不干扰
//深拷贝的实现(函数递归):
var obj={
id:1,
name: 'jason',
msg:{// 浅拷贝遇到对象级别的数据,只是将地址拷贝过去
age:18
},
color:['pink','blue']
};
var o={};
// 封装函数
function deepCopy(newobj,oldobj){
for(var k in oldobj){
// 判断属性值属于哪一种数据类型
//1.获取属性值 oldobj[k]
var item = oldobj[k];
//2.判断这个值是否属于数组
if(item instanceOf Array){
newobj[k]=[];
deepCopy(newobj[k],item)
}else if(item instanceOf Object){
//3.判断这个值是否属于对象
newobj[k]=[];
deepCopy(newobj[k],item)
}else{
//4.属于简单数据类型
newobj[k]=item;
}
}
}
deepCopy(o,obj);
console.log(o);
var arr=[];
console.log(arr instamceOf Object);//true
o.msg.age=20;
console.log(obj);//age:18 修改新复制的对象不会影响obj里面的数据
递归函数是将值给属性
将数组放在最前面是因为数组也属于Object,如果把Object放在前面则将数组作为对象解析了