美文网首页
js深度copy的几种实现

js深度copy的几种实现

作者: callPromise | 来源:发表于2019-01-29 10:44 被阅读0次

    方法一:

    function deepCopy(obj){
                var o;
                switch(typeof obj){
                case 'undefined': break;
                case 'string'   : o = obj + '';break;
                case 'number'   : o = obj - 0;break;
                case 'boolean'  : o = obj;break;
                case 'object'   :
                    if(obj === null){
                        o = null;
                    }else{
                        if(obj instanceof Array){
                            o = [];
                            for(var i = 0, len = obj.length; i < len; i++){
                                o.push(deepCopy(obj[i]));
                            }
                        }else{
                            o = {};
                            for(var k in obj){
                                o[k] = deepCopy(obj[k]);
                            }
                        }
                    }
                    break;
                default:
                    o = obj;break;
                }
                return o;
            }
    

    方法二:

    function deepCopy(obj) {
            return JSON.parse(JSON.stringify(obj));
        }
    

    方法三:

    function deepCopy(obj){
                var newobj, obj;
                if (obj.constructor == Object){
                    newobj = new obj.constructor();
                }else{
                    newobj = new obj.constructor(obj.valueOf());//valueOf()方法返回 Array 对象的原始值
                }
                for(var key in obj){
                    if ( newobj[key] != obj[key] ){
                        if ( typeof(obj[key]) == 'object' ){
                            newobj[key] = deepCopy(obj[key]);
                        }else{
                            newobj[key] = obj[key];
                        }
                    }
                }
                newobj.toString = obj.toString;
                newobj.valueOf = obj.valueOf;
                return newobj;
            }
    

    方法四:

    var cloneObj = function(obj){
        var str, newobj = obj.constructor === Array ? [] : {};
        if(typeof obj !== 'object'){
            return;
        } else if(window.JSON){
            str = JSON.stringify(obj), //系列化对象
            newobj = JSON.parse(str); //还原
        } else {
            for(var i in obj){
                newobj[i] = typeof obj[i] === 'object' ? 
                cloneObj(obj[i]) : obj[i]; 
            }
        }
        return newobj;
    };
    

    方法五:

    function deepCopy(p,c){
            c = c || {};
            for (var i in p){
                if(p.hasOwnProperty(i)){
                    if(typeof p[i] === 'object'){
                        c[i] = Array.isArray(p[i]) ? [] : {};
                        deepCopy(p[i],c[i]);
                    }else{
                        c[i] = p[i];
                    }
                }
            }
            return c;
        }
    

    另: object.assign()只有在obj属性层级为一的时候才为深拷贝

    function deepCopy(obj) {
      return object.assign({}, obj);
    }
    

    相关文章

      网友评论

          本文标题:js深度copy的几种实现

          本文链接:https://www.haomeiwen.com/subject/lhotsqtx.html