【问题标题】:javascript switch vs loop on arrayjavascript在数组上切换vs循环
【发布时间】:2011-10-07 17:09:46
【问题描述】:

我有这两个功能,我想知道哪个更快。我假设第一个,但如果我有数百个案例要评估呢?

function isSpecialKey(k) {
switch (k) {
case 9:
return true;
break;
case 16:
return true;
break;
case 17:
return true;
break;
case 18:
return true;
break;
case 20:
return true;
break;
case 37:
return true;
break;
case 38:
return true;
break;
case 39:
return true;
break;
case 40:
return true;
break;
default:
return false;
break;
}
}


function isSpecialKey(k) {
var arr = [9, 16, 17, 16, 8, 20, 37, 38, 39, 40]
for (i = 0; i < arr.length; i++) { if (k == arr[i]) { return true; } }
return false;
}

【问题讨论】:

  • 你可以自己做一些简单的基准测试,将它们放在一个循环中,并在两种方法之间交替
  • 另一种变体是 var specialKeyBools = [0,0,0,0,0,0,0,,0,1,1,0,0,0,0,0,0,1 ,...];函数 isSpecialKey(k) { return sepcialKeyBools[k];还加快了将您的数组放在函数之外的速度,因此它只发生一次。 (但另一位评论者是“最正确的”:试试看!获取数据。)

标签: javascript


【解决方案1】:

这不太重要,即使有数百个案例。它可能从数千或数万开始变得重要,但在这种情况下,您可能无论如何都不应该使用 JavaScript!至少不在网络浏览器中。

通常 - 从维护的角度来看,第二种方式是唯一有意义的方式。我绝对会接受。

但是,对于您的具体情况,有一个better solution.

【讨论】:

    【解决方案2】:

    不要这样做,只需创建一个地图:

    var specialKeys = {
        9: true,
        16: true,
        17: true,
        ...
        40: true
    };
    

    然后你可以像这样测试它:

    if(specialKeys[value]) {
       ...
    }
    

    【讨论】:

    • 确实如此。对于数组,您可以只使用indexOf。
    【解决方案3】:

    怎么样?

    function isSpecialKey(key) {
      return [9, 16, 17, 16, 8, 20, 37, 38, 39, 40].indexOf(key) > -1;
    }
    

    更新。我只记得有些浏览器不支持数组上的indexOf,但我忘记了其中的哪一个,所以要小心。

    【讨论】:

      【解决方案4】:

      你可以在 switch 中使用 fallthrough,这样可以减少很多代码:

      function isSpecialKey(k) {
        switch (k) {
          case 9:
          case 16:
          case 17:
          case 18:
          case 20:
          case 37:
          case 38:
          case 39:
          case 40:
            return true;
        }
        return false;
      }
      

      同时考虑:

      function isSpecialKey(k) {
        return (
          k == 9 ||
          k == 16 ||
          k == 17 ||
          k == 18 ||
          k == 20 ||
          k == 37 ||
          k == 38 ||
          k == 39 ||
          k == 40
        );
      }
      

      【讨论】:

        【解决方案5】:

        使用地图;更快。 “数百”个开关不应该接近通过代码审查。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-02
          • 2019-04-21
          • 1970-01-01
          • 2022-01-05
          • 2012-08-12
          • 1970-01-01
          • 2020-12-03
          • 1970-01-01
          相关资源
          最近更新 更多