JavaScript使用Try Catch或If Else来提高性能

时间:2013-05-15 18:13:56

标签: javascript if-statement try-catch

我正在试验数据的深层对象树,现在我想要我的代码分解。

很多时候我必须检查是否存在整个分支来设置或取消设置值。我正在使用很多“if else”条件,我正在考虑使用函数。

例如,要在分支中将值设置为false,我可以有两个解决方案,如:

function setFalse(root, /* [names]* */) { ...
    // If root exists, call setFalse() with the rest of arguments.
    // Else if I only have two arguments : root[arguments[1]] = false ;
    // Else return.
... }

或者使用try-catch:

function setFalse(root, /* [names]* */) {
    try {
        var l = arguments.length,
            branch = root ;
        for (var i=1 ; i<l-1 ; i++) // Not taking the last argument.
            branch = branch[arguments[i]] ;
        branch[arguments[l-1]] = false ; // With last argument.
    }
    catch(e) {}
}

第一种方法比第二种方法更干净,但它使用递归,因此它可能很重。 第二种方法有点脏(我认为)但执行起来可能更轻?

我必须确切地说我不关心整个分支是否存在,我只是希望它存在假如果它存在。

一般来说,我有4个分支的深层对象,但它可能更多。 您认为哪种方法效率最高?

1 个答案:

答案 0 :(得分:0)

都不是。第一个是低效的,因为它会创建大量的数组来处理参数,第二个是低效的,因为错误处理通常是一种昂贵的流控制方式。

使用第二个原则,但检查每个级别的属性是否存在,而不是依赖于错误处理:

function setFalse(root /* ,[names] */) {
  var l = arguments.length, branch = root;
  for (var i = 1 ; i < l-1 ; i++) {
    if (!branch.hasOwnProperty(arguments[i])) return;
    branch = branch[arguments[i]];
  }
  if (branch.hasOwnProperty(arguments[l-1])) {
    branch[arguments[l-1]] = false;
  }
}

演示:http://jsfiddle.net/Guffa/j6BXc/