JS中的对象克隆

数据类型分类

js中两大数据类型:简单数据类型和对象类型。

  • 简单类型值::数值、字符串、布尔值、null、undefined
  • 引用类型值:函数、数组
  • 简单类型值保存的是实际数据,;对象类型值保存的是对于对象的引用。

克隆

  • 浅度克隆:简单类型为值传递,对象类型是引用的传递。
  • 深度克隆:所有元素或属性完全复制,与元对象完全脱离,也就是说所有对于新对象的修改都不会反映到原对象中。

浅度克隆

  • 简单类型值
//数值克隆的表现
var a="1";
var b=a;
b="2";
console.log(a);// "1"
console.log(b);// "2"
//字符串克隆的表现
var c="1";
var d=c;
d="2";
console.log(c);// "1"
console.log(d);// "2"
  • 对象类型

前面说过,函数式一等对象,当然也是对象类型,但是函数的克隆通过浅克隆即可实现


var m=function(){alert(1);};
var n=m;
n=function(){alert(2);};

console.log(m());//1
console.log(n());//2
  

通过普通赋值的方式,就实现了函数的克隆,并且不会影响之前的对象。原因就是函数的克隆会在内存单独开辟一块空间,互不影响。

  • 好了,说了这个特殊的”关系户“以后,我们来说说普通的”选手“。为了方便后续的代码表现,我这里定义一个复杂的对象类型oPerson。下面看一下对象类型的浅复制有什么危害:
  var oPerson={
    oName:"rookiebob",
    oAge:"18",
    oAddress:{
        province:"beijing"
    },    
    ofavorite:[
        "swimming",
        {reading:"history book"}
    ],
    skill:function(){
        console.log("bob is coding");
    }
};
function clone(obj){
    var result={};
    for(key in obj){
        result[key]=obj[key];
    }
    return result;
}
var oNew=clone(oPerson);
console.log(oPerson.oAddress.province);//beijing
oNew.oAddress.province="shanghai";
console.log(oPerson.oAddress.province);//shanghai

经过对象克隆以后,我修改oNew的地址,发现原对象oPerson也被修改了。这说明对象的浅度克隆克隆的是引用,即两个对象指向同一块内存地址。

深度克隆

function clone(obj){
    var buf;
    if(obj  instanceof Array){
        buf=[];
        var i=obj.length;
        while(i--){
                buf[i]=clone(obj[j]);
                }
        return buf;
      }else if(obj instanceof Object){
         buf={};
         for(var key in obj){
            buf[k]=clone(obj[k]);
         }
         return buf;
        }else{
           return obj;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值