最近找工作,遇到了灰常多的问题~感觉是边找边学。
有一个笔试题,见过两次,我觉得是该拉出来说说了,那就是 ---- 深度拷贝!
什么是深度拷贝呢?
要说深度拷贝,首先得知道啥是浅拷贝。
浅拷贝:被拷贝者和拷贝者共用一个内存。
比如对一个数组浅拷贝,会发生什么呢?我们来看看以下代码:
var arr = [2,4,3,1];
var brr=arr;
brr.sort();
console.log(arr); // [2,4,3,1]
arr也变了有木有!这就是数组的浅拷贝。
那么深拷贝呢?
深拷贝:被拷贝者重新开辟新的内存。
var arr = [2,4,3,1];
var brr=[];
for(var i=0,l=arr.length;i<l;i++){
brr.push(arr[i]);
}
brr.sort(); // [1,2,3,4]
console.log(arr); // [2,4,3,1]
对于javascript,不同的类型有不同的deepcopy方法:
数组:
方法一:利用循环遍历,依次copy(见上述例子)
方法二:利用数组方法concat,它返回一个新的数组
var arr = [2,4,3,1];
var brr=[];
brr = brr.concat(arr);
brr.sort(); // [1,2,3,4]
console.log(arr); // [2,4,3,1]
对象:利用for in遍历对象
var objA = {};
var objB = {};
for(var i in objA){
// 这里需要用递归,具体见后面的实例
}
其他:(function等)
直接复制即可
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面是一个我自己写的深度拷贝的例纸:
主要思想就是,首先判断被拷贝的东东是数组?对象?其他?
接着用对应的方式进行拷贝。里面有用到递归调用的思想,因为对象有可能是一层套一层套一层的。。。
function deepCopy(o){
var obj;
if(typeof(o)!="object" || o===null)return o;
if(o instanceof Array){
obj=[];
for(var i=0;i< o.length;i++){
if(typeof(o[i])=="object" && o[i]!=null){
obj[i] = deepCopy(o[i]);
}else{
obj[i] = o[i]
}
}
}else if(typeof o === 'object'){
obj = {};
for(var i in o){
if(typeof(o[i])=="object" && o[i]!=null){
obj[i] = deepCopy(o[i]);
}else{
obj[i] = o[i]
}
}
}
return obj;
}
// 测试一下
var A = {
name:'11',
age:[1,2,3],
oo:{
a:1,
b:2
}
};
var B = deepCopy(A);
console.log(B)
结果是酱紫: