javascript 深拷贝

浅拷贝    

<script type="text/javascript">
        var oOriginal = {
            memNum: 1, // number 
            memStr: "I am a string", // string 
            memObj: {
                test1: "Old value" // we'll test 
            },
            memArr: [
                    "a string",
                    {
                        test2: "Try changing me"
                    }
                    ]
        };
        var extend = function (result, source) {
            for (var key in source)
                result[key] = source[key];
            return result;
        }
        var oCopy = extend({}, oOriginal); // 浅拷贝 
        oCopy.memObj.test1 = "New value"; // 出现问题了,会反射到原对象上 
        alert(oOriginal.memObj.test1); // 结果副本与原本都一同被修改了 
        oCopy.memArr[1].test2 = "I am changed";
        alert(oOriginal.memArr[1].test2); // 同样中招了 
    </script>
深拷贝 
<script type="text/javascript">
    var oOriginal = {
        memNum: 1, // number 
        memStr: "I am a string", // string 
        memObj: {
            test1: "Old value" // we'll test 
        },
        memArr: [
                "a string", 
                { 
                test2: "Try changing me" 
                }
                ]
    };
    dom = {};
    dom.is = function (obj, type) {
        var toString = Object.prototype.toString, undefined;
        return (type === "Null" && obj === null) ||(type === "Undefined" && obj === undefined) ||toString.call(obj).slice(8, -1) === type;
    };
    dom.deepCopy = function (result, source) {
        for (var key in source) {
            var copy = source[key];
            if (result === copy) continue; //如window.window === window,会陷入死循环 
            if (dom.is(copy, "Object")) {
                result[key] = arguments.callee(result[key] || {}, copy);
            } else if (dom.is(copy, "Array")) {
                result[key] = arguments.callee(result[key] || [], copy);
            } else {
                result[key] = copy;
            }
        }
        return result;
    };
    var oCopy = dom.deepCopy({}, oOriginal); 
    oCopy.memObj.test1 = "New value"; 
    alert(oOriginal.memObj.test1); 
    oCopy.memArr[1].test2 = "I am changed";
    alert(oOriginal.memArr[1].test2); 
</script> 

转载于:https://www.cnblogs.com/xuzhiwei/archive/2011/08/23/2150608.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值