前段时间开jQuery源代码的时候,正好看到jQuery.extend的实现方案,忽然想到对象的深复制和浅表复制的问题。
因为引用类型对象的存在,所以简单的使用"="只能实现引用关系的复制,所以当其中一个引用指向的变量发生变化的时候,相应的另外一个引用也会发生变化。
所以很多时候也称这种复制为浅表复制。那么如何才能实现对象的深复制呢?以下是实现深复制的简单实现代码,仅供参考。
1 function copyObject(target){
2 return _copy(target);
3
4 function _copy(target){
5 if(typeof(target) == 'function'){ //处理函数的情况
6 return target;
7 } else if( target == null){
8 return target;
9 } else if( typeof(target) == 'object'){
10 var tmp;
11 if(checkIsArray(target)){ // 数组
12 tmp = [];
13 for(var i = 0, length = target.length; i < length; i++){
14 tmp.push(_copy(target[i]));
15 }
16 return tmp;
17 }else{ //对象
18 tmp = {};
19 for(var key in target){
20 tmp[key] = _copy(target[key]);
21 }
22 return tmp;
23 }
24 }else{
25 return target;
26 }
27 }
28
29 function checkIsArray(target){
30 return Object.prototype.toString.call(target) === '[object Array]';
31 }
32 }
其实对于值类型,没有什么需要难处。主要是针对普通的object和数组的处理,这里面用到了递归。