浅拷贝
- 浅拷贝只拷贝一层(简单数据类型的),更深层次对象级别的只拷贝引用
var obj = {
id:1,
name: 'andy',
msg:{
age:18,
},
color:['pink','red'],
};
var o = {
};
//两种浅拷贝方式
//1.通过循环遍历
for(var k in obj){
//k是属性名 obj[k]属性值
o[k] = obj[k];
}
//2.通过assign()进行拷贝,有两个参数,第一个是要拷贝给他东西的对象,第二个是拷贝的对象
Object.assign(o,obj);
console.log(o); //o会获得跟obj一样的值
//但是改变o.msg.age后,obj的age也会被改变
o.msg.age = 20;
console.log(obj);
深拷贝
- 深拷贝拷贝多层,每一级别的数据都会拷贝
var obj = {
id:1,
name: 'andy',
msg:{
age:18,
},
color:['pink','red'],
};
var o = {
};
//封装函数
function deepCopy(newobj,oldobj){
for(var k in oldobj){
//var k in oldobj表示遍历oldobj里的每一个对象k
//判断属性值属于那种数据类型
//1.获取属性值 olgobj[k]
var item = oldobj[k];
//2.判断这个值是否是数组
if(item instanceof Array){
newobj[k] = []; //如果是数组的话就设置newobj[k]为一个空数组
deepCopy(newobj[k],item); //在通过递归,把item里的值赋给这个空数组
}else if(item instanceof Object){
//3.判断这个值是否是对象
newobj[k] = {
};
deepCopy(newobj[k],item);
}else{
//4.属于简单数据类型
newobj[k] = item;
}
}
}
deepCopy(o,obj);
console.log(o);
console.log(obj);
o.msg.age = 20;