var obj = {
name:"sunny",
age:"18",
wife:["visa","mimi"],
parents:{
num:2,
children:{
son:"haha",
daughter:"kaka"
},
love:[1,2,3]
}
}
var obj1 = {};
function deepClone(origin,target){
var target = target || {},
toStr = Object.prototype.toString,
arrStr = "[object Array]";
for(var prop in origin){
if(origin.hasOwnProperty(prop)){
if(origin[prop] !== "null" && typeof(origin[prop]) == 'object'){
// if(toStr.call(origin[prop]) == arrStr){
// target[prop] = [];
// }else{
// target[prop] = {};
// }
target[prop] = toStr.call(origin[prop]) == arrStr?[]:{};
deepClone(origin[prop],target[prop]);
}else{
target[prop] = origin[prop];
}
}
}
return target;
}
方法:
1、判断是否为原始值(原始值直接浅拷贝,引用值深拷贝)—>用for in 进行遍历(数组对象都可以) -->用typeof() == “object”
2、判断引用值是数组还是对象–>1、constructor(构造器,对象的属性) 2、instanceof( A instanceof B 判断A 的原型链上有没有B的原型) 3、toString(arr的toString方法是继承array的) —>在<iframe src="www.baidu.com"></iframe>中,会出现子域数组放在父域数组里面,用第一第二种方法就会返回false。建议用第三种。
3、建立[]或{} -->递归