JavaScript 深度克隆

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴肉火烧荷包蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值