首页 > 代码库 > 实现一个函数clone,使JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制

实现一个函数clone,使JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制

实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制。

 1 /** 对象克隆  2 * 支持基本数据类型及对象  3 * 递归方法 */  4 function clone(obj) {  5     var o;  6     switch (typeof obj) {  7         case "undefined":  8             break;  9         case "string": o = obj + ""; 10             break; 11         case "number": o = obj - 0; 12             break; 13         case "boolean": o = obj; 14             break; 15         case "object": // object 分为两种情况 对象(Object)或数组(Array) 16             if (obj === null) { 17                 o = null; 18             }else{ 19                 if(Object.prototype.toString.call(obj).slice(8,-1) === "Array") { 20                     o = []; 21                     for (var i = 0; i < obj.length; i++) { 22                       o.push(clone(obj[i])); 23                     } 24                 }else{ 25                     o = {}; 26                     for (var k in obj) { 27                         o[k] = clone(obj[k]); 28                     } 29                 } 30             } 31             break; 32         default: o = obj; 33             break; 34     } 35     return o; 36 }37 38 var m1 = clone([1,2,3]);39 var m2 = clone({1:‘1‘, ‘hello‘: 32});40 console.log(m1);  //[ 1, 2, 3 ]41 console.log(m2);  //{ ‘1‘: ‘1‘, hello: 32 }

 拓展:为什么用Object.prototype.toString.call(obj)检测对象类型?不理解这个函数的可以参考这篇博文。

这里我主要解释  Object.prototype.toString.call(obj).slice(8,-1) === "Array" ?是什么意思。

Object.prototype.toString.call([]);  //"[object Array]""[object Array]".slice(8,-1);  //"Array"

如果是数组对象,Object.prototype.toString.call([])的检测结果是  "[object Array]", 通过slice方法截取子串。   字符串的slice()方法可以查看js高程P124

 

实现一个函数clone,使JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制