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