深度克隆对象

有时,我们需要对一个对象进行复制,如下列要求:
1. 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝
2. 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、Object对象。

<script>
    function isObject(obj){
        if(Object.prototype.toString.call(obj)==='[object Array]' || Object.prototype.toString.call(obj)==='[object Object]')
            return true;
        else
            return false;           
    }
    function cloneObject(obj){
        var cloneObj;
        cloneObj=(obj instanceof Array) ? []:{}; //判断对象类型,新建克隆对象
        for(var i in obj){
            if(obj.hasOwnProperty(i)){
                cloneObj[i]=isObject(obj[i]) ? cloneObject(obj[i]):obj[i];
            }
        }
        return cloneObj;
    }


</script>

在题目中,object对象包含两种,一个是数组Array,另一个是{}
obj instanceof Array 通过判断来新建克隆对象属于哪一种


对于简单数组,我们会遇到这种情况

var ary=[1,2,3,4];
var ary1=ary;
ary[0]=8;
console.log(ary[0]);//结果为8
console.log(ary1[1]);//结果为8

为什么会出现这种情况呢?
数组是引用类型数据,在数组之间进行赋值时,没有为新的数组另外开辟内存空间,而是将新数组变量的引用地址指向了原来的数组,所以当原来数组发生变化时,新数组也会产生同样变化。
这不是我们想要的结果,那我们就需要考虑数组克隆了。
下面我们就为数组Array原型添加一个数组克隆的方法
实现数组克隆的方式很多,简单列举几种:

1. 我们最容易想到的一种方式

Array.prototype.clone=function(){ 
    var a=[]; 
    for(var i=0,l=this.length;i<l;i++) 
        a.push(this[i]); 
    return a; 
} 

2. 通过Array对象的slice方法

slice方法是通过参数start和end的传入值来返回数组中的一段,该方法不对原数组进行操作。我们通过slice(0)可以使其返回所有项。

Array.prototype.clone=function(){ 
    return this.slice(0); 
} 

3. 通过Array对象的concat方法

concat方法是用来实现数组的合并的。通过和一个空函数的合并,即可实现我们的克隆功能。

Array.prototype.clone=function(){ 
    return [].concat(this);
} 
//或者 
Array.prototype.clone=function(){ 
    return this.concat(); 
} 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值