js中深、浅copy之我见

定义:

浅copy :对数据或者对象进行直接的copy赋值给另一个数据或对象的方式称为浅copy

深copy :对数据或者对象进行非直接的copy赋值给另一个数据或对象的方式称为深copy!(纯属废话)

 

代码实例:

浅copy:

var a = {name:"hello",age:24,email:"wjh756381193@qq.com"};
var b = a;
console.log(a==b);// true;

深copy:

var a = {name:"hello",age:24,email:"wjh756381193@qq.com"};
var b = {};
b.name=a.name;
b.age=a.age;
b.email=a.email;
console.log(a==b);//false;

 

代码实例解析:

浅copy:

在浅copy中,我们不难发现我们声明了一个对象a,然后又直接声明了一个对象b 并把b的值初始化为了a

大家都知道,在js中我们对复杂数据结构的存储是在内存的堆中的,在栈内我们存在了一个指向这个复杂数据

结构的a,在这里我们可以把a看做为一个地址!这个地址指向了{name:"hello",age:24,'email':"wjh756381193@qq.com"} 这个数据对象。之后 ,我们又声明了一个b 并初始化为了a (注:我的理解这里同样也只是声明了一个地址)同时这个地址和a指向了同一个内存单元。此时,我们对b的任何操作都会反映到a的变量上!

深copy:

在深copy 中,我们先声明了一个对象a,并在内存的堆区为其开辟了一片空间来存放其值({name:"hello",age:24,'email':"wjh756381193@qq.com"}),之后我们又声明了一个对象b,同时也在内存的堆区为其开辟了一片空间存放其值({}),这样的话 我们的a 和 b 已经指向了不同的内存单元。之后对b进行拷贝a的各个属性。在这样的情况下,我们对b对象进行的任何操作都不会反应到a对象上,反之亦然!

 

深copy代码实现:

function deepCopy(o){
    var res 
    if(typeof o ==='object'){
        if(o instanceof Array){
            res = [];
            for(var i in o){
                res.push(deepCopy(o[i]));
            }
        }else if(o instanceof Object){
            res = {};
            for(var i in o){
                res[i]=deepCopy(o[i]);
            }
        }else{
            // throw new Exception();    对异常情况的处理(待优化)
        }
    }else{
        res = o;
    }
    return res;
}

 

          更多源码,请访问 http://www.erdangjiade.com/source

          网页特效下载:www.erdangjiade.com/js

         更多PHP/Mysql功能:www.erdangjiade.com/php

          更多原创模板,尽在 http://www.erdangjiade.com/templates

转载于:https://my.oschina.net/wjhblog/blog/531576

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值