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对象。
浙公网安备 33010602011771号