【问题标题】:efficient alternative to if (a>b) in javascript for checking a variable rangejavascript 中 if (a>b) 检查变量范围的有效替代方法
【发布时间】:2013-07-10 23:30:05
【问题描述】:

我希望标题不要太笼统或误导。

var blah;
if(a > 10) blah = 'large';
if(a <= 10 && a > 5) blah = 'medium';
if(a <= 5 && a >= 0) blah = 'small';

难道没有更优雅、更简洁的方式来实现范围检查吗?

【问题讨论】:

    标签: javascript performance coding-style


    【解决方案1】:

    是的,使用else 子句:

    var blah;
    if(a > 10){
        blah = 'large';
    }else if(a > 5){
        blah = 'medium';
    }else if(a >= 0){
        blah = 'small';
    }
    

    由于您在每个语句中都进行了简单的赋值,因此使用三元表达式也很优雅,尽管许多人会认为这不太可读:

    var blah =
      a > 10 ? 'large'  :
      a > 5  ? 'medium' :
      a >= 0 ? 'small'  :
      undefined; // May want to choose a better default value for a < 0
    

    【讨论】:

    • 我很好奇。如果最有可能的“真实”结果首先出现,它会对性能产生影响吗?例如,如果大部分数据都在“中等”范围内,那么将其作为 if else/if 块中的第一个条件是否有意义?
    • @GMastros 没错。没有逻辑上的差异,但可能存在小的性能差异。
    • @GMastros 你不能把中等检查放在第一位。它会同时捕获大号和中号(例如,20 的值将被检测为中号)
    • @PeteScott 我认为 GMastros 意味着来自 OP 代码的中等检查:a &lt;= 10 &amp;&amp; a &gt; 5
    • @Paulpro 啊。可能。谢谢。 =]
    【解决方案2】:

    您可以使用ternary operators

    var blah;
    
    blah = a > 10 ? 'large' : (a > 5 ? 'medium' : 'small' ) ;
    

    【讨论】:

      【解决方案3】:

      如果你有很多范围间隔,你可以这样做:

      var ranges = [[10, 'large'],
                    [5, 'medium'],
                    [0, 'small']];
      
      function range(n) { 
          for (var i = 0; i < ranges.length; i++) { 
              if (n > ranges[i][0]) {
                  return ranges[i][1]; 
              }
          }
          return 'default value';
      }
      

      这不是那么灵活,因为您不能为每种情况指定是使用&lt; 还是&lt;=,但是如果我有很多范围,我可能会写这样的东西。其他答案很好,只是想我会添加这个作为一个想法。

      【讨论】:

      • 这是一个有趣的想法。只是在我想处理的特殊情况下付出了更多的努力,但绝对是很好的可扩展概念。
      【解决方案4】:

      如果范围是常数,您可以使用组合 switch 语句和取模。 例如。

      var blah;
      switch(a-(a % 5)) {
          case 10:
              blah = 'large';
              break;
          case 5:
              blah = 'medium';
              break;
          case 0:
              blah = 'small';
              break;
          default:
              blah = 'large';
      }
      

      当然,它只能在每个范围之间的差异相等时使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-17
        • 1970-01-01
        • 2014-08-12
        相关资源
        最近更新 更多