JS对象的深度拷贝

零:引言:

JS的变量或者数据分为两种,基本变量和引用变量。

基本类型:Number,String,Boolean,Null,Undefined

引用类型:(也就是对象类型)Object,Array,Function等

基本类型是按值访问的,栈内存保存着的是具体的值

引用类型的数据,在栈内存中保存着的是索引,索引指向存着具体值的堆内存。

 

 

一:对象拷贝

如果进行对象的拷贝,被拷贝的对象里,属性的值可以是基本类型,也可以是引用类型。

比如

var obj = { 
    name:"MaPengcheng",
    age:20,
    grade:[100,99,80]
}

  name和age属性的值就是基本类型,grade属性的值为数组引用类型;

  那么,如果拷贝的时候仅仅是赋值操作:

    基本类型的数据进行拷贝时,直接是拷贝具体的值的。

    但引用类型的数据进行拷贝时,拷贝的是数据所在的索引地址,这样的拷贝结果是会随原来的值的改变而改变的。

二:深度拷贝:

给出具体代码,实现对象的深拷贝:

var toStr = Object.prototype.toString;

function deepCopy(origin,taregt){
   //容错处理  
   var target = target || {};      
   for(var prop in origin){
       //防止这个对象有原型继承下来的属性被拷贝  
       if(origin.hasOwnProperty(prop)){
            if(origin[prop]!=null && typeof origin[prop] == 'object'){
                 target[prop] = toStr.call(origin[prop]) == '[object Array]'?[]:{};
//递归拷贝 deepCopy(origin[prop],target[prop]); }
else{ target[prop] = origin[prop]; } } } return target; }

 

posted @ 2018-07-19 22:27  PunkMa  阅读(129)  评论(0编辑  收藏  举报