javaScript 深拷贝

  一般我们用到的拷贝大部分都是这样的,比如定义一个变量  var a=10,然后将a的值赋值给变量b,这个属于值的拷贝。

  下面我们聊聊数组和对象的拷贝。大家都知道数组和对象都属于引用类型,所以在将一个数组(或对象)赋值给另外一个数组(或对象)的时候,其实传递的是引用的地址。如果我们改变其中一个数组(或对象)的属性或方法时,另外一个也会跟着变化。也就是我们所说的——浅拷贝。代码如下:

     var obj1 = {
            name:'Awen',
            song:{
                author:'赵雷',
                word:'zhaolei'
            },
            geshou:["yigeren",2,3,4]
        };
        var obj2;
        obj2 = obj1;
        obj2.geshou.push('我是新成员');
        console.log(obj1);
        //geshou:Array[5] ==>  ["yigeren",2,3,4,"我是新成员"]

        console.log(obj2);
        //geshou:Array[5] ==>  ["yigeren",2,3,4,"我是新成员"]

  然而,如果我们不想改变原对象(即obj1)中的数据,该怎么办呢?接下来就要用到另外一个知识——深拷贝。深拷贝会另外单独开辟一块内存空间用于存储新对象(或数组),从而让两者除了数据一样外没有任何关系。代码如下:(仅供参考)

function deepCopy(real,copy){
            var copy = copy||{};
            for(var k in real){
                if(typeof real[k]==='object'){
                    //如果copy[k]是数组  则返回数组  如果是对象则返回一个空的对象  然后继续调用 deepCopy
                    copy[k]=Array.isArray(real[k])?[]:{};  //方法一:利用数组的方法检测
                   // copy[k]=(real[k].constructor===Array)?[]:{};  //方法二:用对象的方法检测

                    //递归处理(两种方法)
                    // deepCopy(real[k],copy[k]);//递归第一种方法:直接调用方法
                    arguments.callee(real[k],copy[k]);//第二种:利用argument.callee方法递归调用
                }else{
                    copy[k] = real[k];  
                }
                
            }
            return copy;
        }

  定义一个深拷方法deepCopy,real是源对象; copy是一个新变量,接受拷贝的内容。最后返回copy对象。

 

posted on 2017-03-07 16:58  赵六  阅读(216)  评论(0编辑  收藏  举报