【题记】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")));
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);
var o = JSON.parse(str);