zoukankan      html  css  js  c++  java
  • 实现一个函数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

    当然:也可以使用  obj.constructor == Array ? [] : {}    来判断!!!

  • 相关阅读:
    149. Max Points on a Line(js)
    148. Sort List(js)
    147. Insertion Sort List(js)
    146. LRU Cache(js)
    145. Binary Tree Postorder Traversal(js)
    144. Binary Tree Preorder Traversal(js)
    143. Reorder List(js)
    142. Linked List Cycle II(js)
    141. Linked List Cycle(js)
    140. Word Break II(js)
  • 原文地址:https://www.cnblogs.com/guorange/p/7214726.html
Copyright © 2011-2022 走看看