嵌套的If / Else而不是Else If有什么优点吗?

时间:2010-11-27 09:49:39

标签: javascript performance language-agnostic conditional-statements

我在浏览器检测脚本中遇到了这种独特的做法。

if (/MSIE/.test(_3)) {
    IE = true;
} else {
    if (/AppleWebKit/.test(_3)) {
        Safari = true;
    } else {
        if (/Opera/.test(_3)) {
            Opera = true;
        } else {
            if (/Camino/.test(_3)) {
                Camino = true;
            } else {
                if (/Firefox/.test(_3) || /Netscape/.test(_3) || ) {
                    Mozilla = true;
                }
            }
        }
    }
}

使用这种嵌套的If / Else方法有什么好处吗?

如果我将其更改为:

,该怎么办?
 if (){
 } else if (){
 } else if (){
 } else if (){
 }

它会慢慢运行吗?

3 个答案:

答案 0 :(得分:11)

除了缩进和可读性之外,它不会改变任何其他内容。仍然是相同的代码,完全相同:-)我肯定会改变它,因为它会使它更具可读性。缩进通常意味着嵌套,而这里没有嵌套。

答案 1 :(得分:4)

在这种情况下,还可以使用switch语句吗?类似的东西:

switch ((_3).match(/msie|applewebkit|opera|camino|firefox/i)[0]) {
  case 'MSIE' : /* ...; */ break;
  case 'AppleWebKit' : /* ...; */ break;
  /* ... etc. */
  default: BrowserCouldntBeDetermined = true;
}

我坚持上一个答案:否则if()相当于但更可读,那么{if()...}

无论如何,您找到并呈现的代码看起来有点笨拙,并且由于其他原因而不是if...else的使用方式。关于代码的含义(除问题外),更好的方法来处理浏览器差异是object detection我想说的。

答案 2 :(得分:4)

这被称为“the arrow anti-pattern”(由于与箭头的相似性)......

 if
   if
     if
       if
         do something
       endif
     endif
   endif
 endif

..除了有一些令人信服的理由离开它之外,它几乎总是对可读性不好。

http://www.codinghorror.com/blog/2006/01/flattening-arrow-code.html

我会压扁它。