JavaScript 深度克隆

需求:
*使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝
*被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、Object对象。不会包含函数、正则对象等

什么是深度克隆,通俗的说:就是在给你一个对象的前提下,你创建一个和这个对象一模一样的对象,所有属性和值都相等,并且修改新对象的属性不会影响旧的对象。

自己归纳了两种实现方法,惭愧的是自己不能通过自己的努力来解决这个问题,现记录如下:

第一种方法显得挺简单直接,有一定的基础js能力便能理解,代码如下:

function clone(obj){
    var o;
    switch(typeof obj){
    case 'undefined': break;
    case 'string'   : o = obj + '';break;
    case 'number'   : o = obj - 0;break;
    case 'boolean'  : o = obj;break;
    case 'object'   :
        if(obj === null){
            o = null;
        }else{
            if(obj instanceof Array){
                o = [];
                for(var i = 0, len = obj.length; i < len; i++){
                    o.push(clone(obj[i]));
                }
            }else{
                o = {};
                for(var k in obj){
                    o[k] = clone(obj[k]);
                }
            }
        }
        break;
    default:        
        o = obj;break;
    }
    return o;   
}

以构造方法实现是为方法二:

function clone2(obj){
    var o, obj;
    if (obj.constructor == Object){
        o = new obj.constructor(); 
    }else{
        o = new obj.constructor(obj.valueOf()); 
    }
    for(var key in obj){
        if ( o[key] != obj[key] ){ 
            if ( typeof(obj[key]) == 'object' ){ 
                o[key] = clone2(obj[key]);
            }else{
                o[key] = obj[key];
            }
        }
    }
    o.toString = obj.toString;
    o.valueOf = obj.valueOf;
    return o;
}

真正需求所说的实现方法如下,用递归来完成:

function clone3(obj){
    function Clone(){}
    Clone.prototype = obj;
    var o = new Clone();
    for(var a in o){
        if(typeof o[a] == "object") {
            o[a] = clone3(o[a]);
        }
    }
    return o;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值