使用迭代样式在JavaScript中克隆对象

NVI*_*NVI 13 javascript iteration algorithm tree recursion

是否可以重写以下JavaScript递归函数以使其更快?

function clone_recursive(object) {
    var result = {};
    for (var key in object) {
        var value = object[key];
        if (typeof value === 'object') {
            result[key] = clone_recursive(value);
        } else {
            result[key] = value;
        }
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

我以迭代的方式重写了它,但它没有获得任何性能,实际上速度下降了≈20%.

function clone_iterative(object) {
    var result = {};
    var queue = [{base: result, value: object}];
    var item;
    while (item = queue.shift()) {
        var current = item.value;
        var base = item.base;
        for (var key in current) {
            var value = current[key];
            if (typeof value === 'object') {
                var resultValue = base[key] = {};
                queue.push({base: resultValue, value: value});
            } else {
                base[key] = value;
            }
        }
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

http://jsperf.com/clone-an-object/13

out*_*tis 9

令人怀疑的是,迭代版本真的会更快,因为您正在使用多次调用排队函数来替换递归调用.对迭代的转换有助于防止堆栈溢出(因为调用堆栈往往小于解释语言中的堆栈),并且在没有尾调用优化的语言中使用尾递归.