一般我们用到的拷贝大部分都是这样的,比如定义一个变量 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对象。