欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

js深度clone的代码实例

程序员文章站 2022-05-18 17:28:57
js深度clone的代码实例 var app = app || {}; (function(){ /** * 判断是否是数组 * @param val...

js深度clone的代码实例

var app = app || {};
(function(){
    /**
     * 判断是否是数组
     * @param val
     * @returns {boolean}
     */
    var tostring = object.prototype.tostring;
    app.isarray = function(val){
        return ('isarray' in array) ? array.isarray(val) : tostring.call(val) === '[object array]';
    };
     /**
     * 判断是否是对象
     * ie6 使用tostring判断是object
     * @param val
     * @returns {boolean}
     */
    app.isobject = function(val){
        return tostring.call(null) === '[object object]'
            ? val !== null && val !== undefined && tostring.call(val) === '[object object]' && val.ownerdocument === undefined//排除dom
            : tostring.call(val) === '[object object]';
    };
/**
 * copy 解除引用
 * @param val
 * @returns {*}
 */
app.clone = function(val){
    return json.parse(json.stringify(val));
};
app.cloneallobject = function(val){
    var k,
        obj;
    for(k in val){
        var item = val[k];
        if(app.isarray(item)){//判断数组
            obj[k] = app.cloneallarray(item);
        }else if(app.isobject(item)){
            obj[k] = app.cloneallitems(item);
        }else{
            obj[k] = item;
        }
    }
    return item;
};
app.cloneallarray = function(val){
    /**
     * 解除数组关系的引用
     * @type {array.<t>}
     */
    var arr = array.prototype.slice.call(val),
        newarr = [],
        i,
        len = arr.length;
    for(i=0;i<len;i++){
        var item = arr[i];
        if(app.isarray(item)){
            newarr.push(app.cloneallarray(item));
        }else if(app.isobject(item)){
            newarr.push(app.cloneallobject(item));
        }else{
            newarr.push(val);
        }
    }
    return newarr;
};
app.cloneallitems = function(val){
    //解除引用
    val = app.clone(val);
    if(app.isarray(val)){
        app.cloneallarray();
    }else if(app.isarray(val)){
        app.cloneallobject(val);
    }
    return val;
};
}());