关于JS对象浅复制,深复制的一些理解与代码

对象是引用存储,存储在堆中。当设置两个对象相等时,改变其中一个对象的属性值,另一个对象也会发生改变,这是因为共用着一个相同的对象。

        var obj = {

            a : 1,

            b : { o : 5 },

            c : function(){  },

            d : [1,2,3]

        }

浅复制:

var clone_obj = {}

        for(var attr in obj){

            clone_obj[attr] = obj[attr];

        }

浅复制在for in 循环中因为不知道对象内部是否有对象,只可以遍历复制最外面的一层,这样就有可能导致引用相同的对象地址。当原对象中为value的对象值改变时,复制出的对象也会产生相应的变化,不能够做到完全分离。

深复制 法1:

可以使用简单粗暴的JSON字符串转换方式,转成字符串后再转回成对象赋值,完成深复制。不足:不能复制函数!当对象的value值中存在函数时需要注意。

var clone_obj_str = JSON.stringify(obj);

var clone_obj = JSON.parse(clone_obj_str);

深复制 法2:

通过递归来进行深复制。代码判断时条件1:区分对象和null。因为 typeof {} === typeof null ; 都为object,需要进行分离。

判断条件2:区分出数组。数组也是对象,可通过 arr.constructor === Array 和 Array.isArray(arr)(ES6)方法来进行区分。

        function cloneObj(obj , clone_obj){

            var clone_obj = clone_obj || {};

            for(var attr in obj){

                // 判断 vaule 类型

                if(typeof obj[attr] === "object" && obj !== null){

                    // 判断 value 是数组还是对象,并赋予相应空值

                    clone_obj[attr] = obj[attr].constructor === Array ? [] : {};

                    cloneObj(obj[attr] , clone_obj[attr]);

                }else{

                    clone_obj[attr] = obj[attr]; 

                }

            }

            return clone_obj;

        }

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值