JavaScript深克隆和浅克隆

var obj = {
    name:"",
    legs:['1', '2'],
    heart:{
        leftAtrium:"左心房",
        rightAtrium:"右心房"
    }
};
/**
 * 对象浅克隆
 * @param src 源对象
 * @returns {*}
 * 浅克隆只会将源对象自身可枚举属性依次复制;
 * 不会对源对象的各个属性所包含的子对象递归复制
 */
var shallowCopy = function(src){
    var dObj = {};
    for(var prop in src){
        if(src.hasOwnProperty(prop)){
            dObj[prop] = src[prop];
        }
    }
    return dObj;
}
var shallowCopyObj = shallowCopy(obj);;

console.log(shallowCopyObj);

/*
 * 源对象的属性包含子对象,则源对象与目标对象的该属性指向同一个内存地址
 * 测试如下
 */
shallowCopyObj.heart.leftAtrium = "人工制造";
shallowCopyObj.legs.pop();
console.log(obj);
/**
 * 对象深克隆
 * @param src 源对象
 * @returns {*}
 * 深克隆会将源对象可枚举的个属性依次复制;
 * 并对源对象的各个属性所包含的zi对象进行递归复制
 */
var deepCopy = function(src){
    var str, retObj = src.constructor === Array ? [] : {};
    if(typeof src != 'object'){
        return;
    } else if(window.JSON){
        str = JSON.stringify(src);
        retObj = JSON.parse(str);
    } else {
        for(var i in src){
            if(src.hasOwnProperty(i)){
                retObj[i] = typeof src[i] === 'object' ? deepCopy(src[i]) : src[i];
            }
        }
    }
    return retObj;
}
var deepCopyObj = deepCopy(obj);
console.log(deepCopyObj);

/*
 * 源对象的属性包含子对象,则目标对象的该属性会指向一个新开内存地址
 * 测试如下
 */
deepCopyObj.heart.leftAtrium = "人工制造";
deepCopyObj.legs.pop();
console.log(deepCopyObj)
console.log(obj);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值