浅克隆:如果包含内嵌的对象或数组,则不再复制副本
var lilei={
sname:"Li Lei",
sage:11
}
function clone(obj){
var newObj={};
//遍历原obj的每个属性
for(var key in obj){
//在新对象中添加和原对象中同名的属性
newObj[key]=obj[key];
}
return newObj;
}
console.log(lilei);
var lilei2=clone(lilei);
console.log(lilei2);
console.log(lilei==lilei2);//true
运行结果:
深克隆:如果包含内嵌的对象或数组,也复制副本
var lilei={
sname:"Li Lei",
score:null,
friends:["jack","rose"],
address:{
prov:"Guang Xi",
city:"Guang Xi",
area:"Nan Ning",
street:"Xu Dong"
},
sage:11
}
function clone(obj){
//如果obj是null
if(obj===null){
return null;
}else if({}.toString.call(obj)==="[object Array]"){
//如果是数组,就复制数组
var newArr=[];
newArr=obj.slice(); //复制数组
return newArr;
}
var newObj={};
//遍历原obj的每个属性
for(var key in obj){
//如果原对象中当前属性值是原始类型
if(typeof obj[key]!=="object"){
//在新对象中添加和原对象中同名的属性
newObj[key]=obj[key];
//原始类型复制,就是复制副本
}else{//否则,当前属性不是原始类型的值,再次调用clone函数,继续复制当前属性值
newObj[key]=clone(obj[key])
}
}
return newObj;
}
console.log(lilei);
var lilei2=clone(lilei);
console.log(lilei2);
console.log(lilei==lilei2);//true
lilei2.address.area="Xu Dong";
console.log(lilei.address);
运行结果: