浅拷贝
如果对象中的属性是引用类型的值,那么存在数据共享问题,修改某个对象会对拷贝的对象产生影响
代码示例
var o = {name:"张三",car:{number:"2017",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:"2017",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);
注意isArray的兼容性问题
isArray是ECMA5中新推出的方法,需要处理兼容性问题
if (Array.isArray != "function")
{
Array.isArray = function (obj) {
return Object.prototype.toString.call(obj) == '[object Array]';
}
}
网友评论