![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Clone</title> 6 </head> 7 <body> 8 <script> 9 function clone(arr){ 10 var copy; 11 switch( typeof obj){ 12 case "undefined": 13 break; 14 case "number": 15 copy=obj-0; 16 break; 17 case "string": 18 copy=obj+""; 19 break; 20 case "boolean": 21 copy=obj; 22 break; 23 case "object": 24 if(obj==null){ 25 copy=null; 26 }else{ 27 if(Object.prototype.toString.call(obj).slice(8,-1)==="Array"){ 28 copy=[]; 29 for(var i=0;i<obj.length;i++){ 30 copy.push(clone(obj[i])); 31 } 32 }else{ 33 copy={}; 34 for(var j in obj){ 35 copy[j]=clone(obj[j]); 36 } 37 } 38 } 39 default: 40 copy=obj; 41 break; 42 } 43 return copy; 44 } 45 </script> 46 </body> 47 </html> 48
整体思路:数组作为参数传递给clone函数。判断数组的数据类型,根据不同的数据类型做不同操作。
其中只有object对象类型,需要分多种情况,因为typeof null 返回的数据类型也是“object”,所以进行单独的操作。
另外由于typeof返回的只是基本数据类型。所以需要进一步对数组和对象的类型进行判定。如下:
1 if(Object.prototype.toString.call(obj).slice(8,-1)==="Array"){ 2 copy=[]; 3 for(var i=0;i<obj.length;i++){ 4 copy.push(clone(obj[i])); 5 } 6 }else{ 7 copy={}; 8 for(var j in obj){ 9 copy[j]=clone(obj[j]); 10 }