代码之家  ›  专栏  ›  技术社区  ›  Robin Rodricks

嵌套的if/else而不是else if有什么好处吗?

  •  6
  • Robin Rodricks  · 技术社区  · 14 年前

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

    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 回复  |  直到 14 年前
        1
  •  4
  •   KooiInc    14 年前

    在这种情况下, switch 还可以使用语句?比如:

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

    我坚持前面的答案:else if()等同于但更可读,那么else if()…

    不管怎样,您发现和呈现的代码看起来有点笨拙,而且不是很快,因为其他原因。 if...else 使用。关于代码的含义(除了问题),处理浏览器差异的更好方法是 object detection 我会说。

        2
  •  11
  •   Darin Dimitrov    14 年前

    除了缩进和可读性之外,它不会改变任何东西。仍然是相同的代码,绝对等价的:-)我肯定会更改它,尽管这样会使它更可读。缩进通常意味着嵌套,而这里没有嵌套。

        3
  •  4
  •   Jeff Atwood    14 年前

    这被称为” 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

    我会把它弄平。

    推荐文章