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 ? [] : {}    来判断!!!

  • 相关阅读:
    vs 编译加速
    leetcode 1405
    sort 从大到小从小到大
    leetcode1404
    leetcode 1406
    leetcode 1556
    杭电研究生自动登录联网脚本
    Cannot mix incompatible Qt library (version ) with this library (version ) 解决方案
    目标检测算法优化技巧
    特征工程和模型融合--机器学习--思维导图和笔记
  • 原文地址:https://www.cnblogs.com/guorange/p/7214726.html
Copyright © 2011-2022 走看看