代码之家  ›  专栏  ›  技术社区  ›  Mark

JS中的较短条件

  •  5
  • Mark  · 技术社区  · 15 年前

    我有这样的条件:

    if (foo == 'fgfg' || foo == 'asdf' || foo == 'adsfasdf') {
    // do stuff
    
    }
    

    当然有更快的方法来写这个吗?

    谢谢。

    7 回复  |  直到 15 年前
        1
  •  4
  •   Ori Pessach    15 年前

    我会保持条件不变。任何缩短代码长度的巧妙方法都会使代码不那么惯用,也不那么可读。

    现在,如果您关心可读性,可以定义一个函数来进行比较:

    if( foo_satisfies_condition(foo) ) {
      // ...
    }
    

    或:

    if( is_month_name(foo) {
      // ...
    }
    

    如果您给函数起一个名称来忠实地描述它所做的工作,那么就更容易理解代码的意图。

    如何实现该函数将取决于需要多少比较。如果您有大量要比较的字符串,可以使用哈希。但是,在读取调用代码时,实现细节是不相关的。

        2
  •  6
  •   erjiang    15 年前

    您可以考虑使用switch case语句

    switch(foo) {
      case "fgfg":
      case "asdf":
      case "adsfasdf":
        // ...
    }
    

    它并不是真的更短,但根据您使用的条件的多少,它可能更可读。

        3
  •  4
  •   Matthew Flaschen    15 年前
    if (/^(fgfg|asdf|adsfasdf)$/.test(foo)) {
    

    或:

    if (["fgfg", "asdf", "adsfasdf"].indexOf(foo) != -1) {
    

    跨浏览器支持 Array.indexOf 仍然有限。此外,这些文件的写入速度更快,可能不会运行得更快。

        4
  •  4
  •   friedo    15 年前

    不需要使用 indexOf 或者是一个regex,如果只使用哈希表:

    var things = { 'fgfg' : 1, 'asdf' : 1, 'asdfasdf' : 1 };
    if ( things[foo] ) { 
        ... 
    }
    
        5
  •  1
  •   Dumb Guy    15 年前

    以下是一个简单的方法:

    String.prototype.testList = function(lst) {
     lst = lst.split('|');
     for(var i=0; i<lst.length; i++){
      if (this == lst[i]) return true;
     }
     return false;
    };
    

    要使用此功能,只需执行以下操作:

    if (foo.testList('fgfg|asdf|adsfasdf')) {
    

    您也可以重命名 testList 将分隔符从更改为 | 任何你想要的。

        6
  •  0
  •   Anthony Atmaram    15 年前

    视情况而定……

    //At some point in your code
    var vals = new Array('fgfg', 'asdf', 'adsfasdf');
    //...
    if(vals.indexOf(foo) >= 0)
    
        7
  •  0
  •   Community CDub    8 年前

    Ternary operator 如果你喜欢或有其他的,看起来不错