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

Rob*_*cks 6 javascript language-agnostic performance 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;
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

如果我将其更改为:

 if (){
 } else if (){
 } else if (){
 } else if (){
 }
Run Code Online (Sandbox Code Playgroud)

它会运行得慢还是什么?

Dar*_*rov 11

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


Jef*_*ood 5

这被称为“ 箭头反模式 ”(由于与箭头相似)...

 如果
   如果
     如果
       如果
         做点什么
       万一
     万一
   万一
 万一

..几乎总是不利于可读性,除非有一些令人信服的理由离开它。

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

我会把它弄平。


Koo*_*Inc 4

这种情况下switch还可以用这个语句吗?就像是:

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

我坚持之前的答案: else if() 相当于但更具可读性 else { if () ...}

无论如何,您找到并提供的代码看起来有点笨拙,而且由于if...else除使用方式之外的其他原因,速度并不快。关于代码的含义(除了问题之外),我想说,处理浏览器差异的更好方法是通过对象检测。