javascript深拷贝 deep clone

342 阅读1分钟
const deepClone = function(v, depth) {
    // default
    if (typeof depth !== "number") {
        depth = 10;
    }
    // new value;
    var o;
    // end recursion
    if (depth <= 0) {
        return (o = v);
    }
    var type = typeof v;
    // simple type
    if (type === "undefined" || type === "number") {
        return (o = v);
    }
    // object
    if (type !== "object") {
        return (o = v);
    }
    if (v instanceof Date) {
        var o = new Date();
        o.setTime( v.getTime() );
    } else if (v instanceof Array) {
        o[i] = deepClone(v[i], depth-1);
    } else {
        o = {};
        for (var prop in v) {
            if (v.hasOwnProperty(prop)){
                o[prop] = deepClone(v[prop], depth-1);
            }
        }
    }
    return o;
}

设计测试用例

var data = {
    "code":0,
    "data": {"result":false},
    "error":{},
    "array": [{"date": new Date()}, {"regexp": new RegExp(/^a.*$/)}],
    "extra":{
	"cost":0.001359726,
	"request-id":"5a7320b08f884fd2f69f7ab38c2421ac@2@u"
    }
};

var newData = deepClone(data);
console.log(newData);

console.log("modified:");
newData.array[1].regexp = /^b.*$/;
newData.extra.cost = 999999;
console.log(newData);

console.log("original:");
console.log(data);