实现JS对象深复制的简单方案

前段时间开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和数组的处理,这里面用到了递归。

posted @ 2015-08-07 08:58  hebutyll  阅读(327)  评论(0编辑  收藏  举报