标签归档:util

Javascript 对象深度克隆

对象的深度克隆,最大的问题就循环引用了。

现在,就在函数中使用一个数组,将所有的引用都保存起来,在clone前先检查,这个引用是否已经存在了,如果已经存在,就不再解析这个对象。

然后就很简单的了,直接上代码:

function cloneObject(obj){
    if(typeof obj !== 'object' || obj === null){
        return obj;
    }
    // 保存引用 
    var refs = arguments[1];
    // 通过 _refid 属性判断参数是不是需要的refs
    if(typeof refs === 'undefined' || refs === null || !refs._refid){
        refs = [obj];
        refs._refid = Math.random();
    } else if((function(refs, obj){
        // 检查引用是否存在  存在时返回true
        for(var i = 0;i < refs.length; i++){
            if(refs[i] === obj){
                return true;
            }
        }
        
        return false;
    })(refs, obj)){
        return obj;
    } else {
        // 保存当前对象的引用
        refs.push(obj);
    }
    
    var newobj = {};
    // 检查对象是否是数组
    if(typeof obj === 'object' && typeof obj.length === 'number' && obj.slice === Array.prototype.slice){
        newobj = [];
    }
    
    for(var key in obj){
        newobj[key] = cloneObject(obj[key], refs);
    }
    
    return newobj;
}

更多信息请到 http://git.oschina.net/hyjiacan/jsfunc