首页 > 深度复制对象。被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、Object对象。不会包含函数、正则对象等

深度复制对象。被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、Object对象。不会包含函数、正则对象等

实现了深度复制对象,但是如何限制类型呢?

function isClass(o){
    if(o === undefined){
        return "Undefined";
    }else {
        return Object.prototype.toString.call(o).slice(8,-1);
    }
}

function cloneObject(src){
    var result,oClass = isClass(src);
    if(oClass === "Object"){
        result = {};
    }else if (oClass === "Array") {
        result = [];
    }else{
        return src;
    }
    for(key in src){
        var copy = src[key];
        if(isClass(copy) == "Object" || "Array"){
            result[key]=arguments.callee(copy);
        }else{
            result[key]=src[key];
        }
    }
    return result;
}

判断类型玩个curry化

function isType(type) {
  return function(obj) {
    return {}.toString.call(obj) == "[object " + type + "]"
  }
}
var isObject = isType("Object")
var isArray = Array.isArray || isType("Array")

isClass(copy) == "Object" || "Array" 这个错的有点严重啊


函数槽点比较多..两次判断类型造成资源浪费,而且 isClass(o) === "Object" || "Array" 这句很显然是大错特错的,太想当然了。另外 arguments.callee 手册已经不推荐使用了,直接使用函数名会好一点。

function cloneObject(src){
    var result;
    switch(isClass(src)) {
        case "Array": result = []; break;
        case "Object": result = {}; break;
        /** 如果是要过滤掉 Function 和 RegExp 的话 **/
        case "RegExp":
        case "Function": return null; break;
        /** 结束 **/
        default: return src; break;
    }
    for(key in src) {
        var copy = cloneObject(src[key]);
        if( copy != null ) result[key] = copy;
    }
    return result;
}
【热门文章】
【热门文章】