ホームページ  >  に質問  >  本文

javascript - 深度复制对象。被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、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;
}
伊谢尔伦伊谢尔伦2729日前541

全員に返信(2)返信します

  • ringa_lee

    ringa_lee2017-04-10 15:11:03

    函数槽点比较多..两次判断类型造成资源浪费,而且 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;
    }
    

    返事
    0
  • PHPz

    PHPz2017-04-10 15:11:03

    判断类型玩个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" 这个错的有点严重啊

    返事
    0
  • キャンセル返事