淺拷貝
如果對象中的屬性是引用類型的值,那么存在數(shù)據(jù)共享問題,修改某個對象會對拷貝的對象產(chǎn)生影響
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 || {}; //如果沒有傳入,那么就創(chuàng)建一個空的對象
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);