浅拷贝
如果对象中的属性是引用类型的值,那么存在数据共享问题,修改某个对象会对拷贝的对象产生影响
var o = {name:"张三",car:{number:"2018",type:"火车"}};
var obj = {};
//obj对象需要拷贝o对象中所有的属性
for (var i in o ){
obj[i] = o[i];
}
console.log(obj);
o.car.type = "飞船";
console.log(obj);
深拷贝
如果对象中的属性是值类型,那么就直接拷贝赋值
如果对象中的属性是引用类型,那么就再次调用拷贝方法,遍历对象
var o = {name:"张三",car:{number:"2018",type:"火车"}};
var obj = {};
function deepCopy(obj,tmp) {
tmp = tmp || {}; //如果没有传入,那么就创建一个空的对象
for(var i in obj)
{
if (obj.hasOwnProperty(i)) //只拷贝实例属性
{
//判断是否是引用类型
if ((typeof obj[i]) == 'object')
{
//重新调用拷贝方法
tmp[i] = Array.isArray(obj[i]) ? [] :{};
deepCopy(obj[i],tmp[i]);
}else
{
//直接拷贝
tmp[i] = obj[i];
}
}
}
}
deepCopy(o,obj);
console.log(obj);
o.car.type = "测试的类型";
console.log(obj);
console.log(o);