var obj = {
name : "abc",
age : 123,
card : ["visa","master"],
message : {
money : 1000,
id : "A0001",
tel : {
telOne : "0000",
telTwo : "0001",
}
}
}
var obj1 = {}
//1.判断有没有目标对象
//2.判断源对象中的属性是引用值还是原始值
//3.原始值直接赋值,引用值遍历后在复制 如果引用值中还有引用值就循环遍历
//4.使用递归
function deelClone(target,origin){
//判断目标对象是否存在
var target = target || {},
opt = Object.prototype.toString;
for (var i in origin){//遍历源对象属性
//for in 循环会将自己写在上级原型链上的属性当作自身属性进行循环
//hasOwnProperty 可以判断是自身属性还是原型链上的属性
if(origin.hasOwnProperty(i)){
//判断这个遍历出来的属性是原始值还是引用值
//如果是引用值 并且这个值不为null
if(typeof(origin[i]) == "object" && origin[i] != null){
//判断这个原始值是数组还是对象
//如果是数组就让目标对象的这个属性为一个空数组
//如果是对象就让目标对象的这个属性为一个空对象
if(opt.call(origin[i]) == "[object Array]"){
target[i] = [];
}else{
target[i] = {};
}
//因为是对象 所以以这个对象中的属性为实参然后在次进行这个方法的调用 以便于将这个对象中的属性全部取出
//使用类似递归的方法 让这个源对象中的属性为原始值时 就跳出这个循环
deelClone(target[i],origin[i]);
//如果是原始值 就直接赋值
}else{
target[i] = origin[i];
}
}
}
return target;
}
deelClone(obj1,obj);
JavaScript 深度克隆
最新推荐文章于 2022-10-20 16:14:55 发布