代码改变世界

【javascript基础】之深度克隆(深度拷贝)一个对象

2012-11-19 22:29  sniper007  阅读(337)  评论(0编辑  收藏  举报

【题记】JavaScript深度克隆(深度拷贝)一个对象 http://www.css88.com/archives/4818  看到这篇文章,愚人码头方法还行,但总觉得缺少了什么,如果参数是伪数组的时候,比如childNodes,获取的是NodeList,是一个伪数组,用Array.prototype.slice.call(obj, 0)会报错,因为IE8以及更早的版本将NodeList以COM对象形式实现的。

我的代码如下:

 1 function isArray( obj ){
 2     return     Object.prototype.toString.call(obj) === '[object Array]';
 3 }
 4 
 5 function isObject( obj ){
 6     return     Object.prototype.toString.call(obj) === '[object Object]';
 7 }
 8 
 9 function extend(obj){
10     
11     if(!obj || (obj.length && obj.length === 0) ){
12         throw new Error("[参数错误]:请传入对象或者数组");    
13     }
14     
15     var rets = null;
16     
17     if(obj.length){        
18         try{
19             rets = [].slice.call(obj, 0);    
20         }catch(e){
21             rets = [];
22             i = obj.length;
23             while(i--){
24                 rets[i] = obj[i];
25             }
26         }
27     }else{
28         rets = {}
29         for(var key in obj){
30             var value = obj[key];
31             if(obj.hasOwnProperty(key)){
32                 rets[key] = isObject(value) ? extend(value) : value;
33             }    
34         }    
35     
36     }
37     
38     return rets;    
39 }
40 
41 var a = {
42     attr1 : 11,
43     attr2 : 22,
44     attr3 : {
45         attr31 : 31    ,
46         attr44 : {
47             1 : 33,
48             33: 333    
49         }
50     }    
51 };
52 
53 console.log(extend(a));
54 
55 console.log(extend(document.querySelectorAll("div")));

 运行输出结果如下:

 还有文章里面还有一个方法挺好的,用的是JSON的方法

var str = JSON.stringify(obj);
var o = JSON.parse(str);