Javascript切换与if ... else if else

Joh*_*ock 132 javascript conditional cross-browser

伙计们我有几个问题:

  1. JavaScript switch语句与JavaScript之间是否存在性能差异if...else
  2. 如果是这样的话?
  3. 浏览器的行为switchif...else不同之处是什么?(FireFox,IE,Chrome,Opera,Safari)

提出这个问题的原因似乎是我switch在Firefox中的大约1000个案例的声明中获得了更好的表现.


编辑 不幸的是,这不是我的代码,Javascript正在从编译库生成服务器,我无法访问代码.调用生成javascript的方法

CreateConditionals(string name, string arrayofvalues, string arrayofActions)
Run Code Online (Sandbox Code Playgroud)

note arrayofvalues是逗号分隔的列表.

它产生的是什么

function [name] (value) {
  if (value == [value from array index x]) {
     [action from array index x]
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:where [name]=传递给serverside函数的名称

现在我将要插入的函数的输出更改为TextArea,编写了一些JavaScript代码来解析函数,并将其转换为一组case语句.

最后我运行该功能,它运行良好但IE和Firefox的性能不同.

Tom*_*mmy 106

回答一般性问题:

  1. 是的,通常.
  2. 在这里查看更多信息
  3. 是的,因为每个都有不同的JS处理引擎,但是,在下面的站点上运行测试时,交换机总是在大量迭代时执行if,elseif.

测试现场

  • @Tommy«[在此处查看更多信息](https://www.oreilly.com/library/view/high-performance-javascript/9781449382308/ch04s02.html)»给出404,那是什么? (3认同)
  • @Tommy好文章,谢谢分享.然而,文章指出JS中的`switch`和`if/then`语句之间的性能差异可以忽略不计.文章指出这是由于参差不齐的"切换"优化以及不同JS引擎运行的不同方式.引用:`由于大多数JavaScript引擎都没有这样的优化,因此switch语句的性能参差不齐 (2认同)
  • 本说明书中是否有可量化的内容?它读起来就像很多"最佳实践/过早优化"猜想.它也是在7年前写的,所以javascript优化在这个时候发生了巨大的变化.在编译语言中,这三种操作之间的性能差异"几乎从未显着到足以照顾".不要费心优化不会影响实际性能的事情.优化可读性. (2认同)
  • @LogicDaemon-IIRC是指向一些oRielly文本框的链接,该文本框涉及了一些深入的JS性能注意事项/讨论 (2认同)

Poi*_*nty 59

有时最好不要使用它.例如,在"调度"情况下,Javascript允许您以完全不同的方式执行操作:

function dispatch(funCode) {
  var map = {
    'explode': function() {
      prepExplosive();
      if (flammable()) issueWarning();
      doExplode();
    },

    'hibernate': function() {
      if (status() == 'sleeping') return;
      // ... I can't keep making this stuff up
    },
    // ...
  };

  var thisFun = map[funCode];
  if (thisFun) thisFun();
}
Run Code Online (Sandbox Code Playgroud)

通过创建对象来设置多向分支具有很多优点.您可以动态添加和删除功能.您可以从数据创建调度表.您可以通过编程方式检查它.您可以使用其他功能构建处理程序.

有一个函数调用的额外开销来获得等效的"case",但是哈希查找的优势(当有很多情况时)找到特定键的函数.

  • 您的策略很好,我经常使用。但是,正如@Michael Geary /sf/answers/3173576381/指出的那样,必须在调度上下文外部声明map变量,否则它将始终被重新评估。 (2认同)

Guf*_*ffa 17

a switch和a之间的性能差异if...else if...else很小,它们基本上做同样的工作.它们之间可能有所不同的一个区别是,要测试的表达式仅在一段switch时间内被评估,每次评估它if.如果评估表达式的成本很高,那么一次这样做当然比做一百次更快.

这些命令(以及一般所有脚本)的实现差异在浏览器之间有很大差异.在不同的浏览器中看到相同代码的相当大的性能差异是很常见的.

由于您几乎无法在所有浏览器中对所有代码进行性能测试,因此您应该选择最适合您所做工作的代码,并尝试减少完成的工作量而不是优化工作方式.


Mic*_*ary 8

Pointy 的回答建议使用对象文字作为switchor if/的替代else。我也喜欢这种方法,但是map每次dispatch调用该函数时,答案中的代码都会创建一个新对象:

function dispatch(funCode) {
  var map = {
    'explode': function() {
      prepExplosive();
      if (flammable()) issueWarning();
      doExplode();
    },

    'hibernate': function() {
      if (status() == 'sleeping') return;
      // ... I can't keep making this stuff up
    },
    // ...
  };

  var thisFun = map[funCode];
  if (thisFun) thisFun();
}
Run Code Online (Sandbox Code Playgroud)

如果map包含大量条目,这会产生大量开销。最好只设置一次动作地图,然后每次都使用已经创建的地图,例如:

var actions = {
    'explode': function() {
        prepExplosive();
        if( flammable() ) issueWarning();
        doExplode();
    },

    'hibernate': function() {
        if( status() == 'sleeping' ) return;
        // ... I can't keep making this stuff up
    },
    // ...
};

function dispatch( name ) {
    var action = actions[name];
    if( action ) action();
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*cto 6

  1. 如果存在差异,它将永远不会大到足以引起注意.
  2. N/A
  3. 不,它们都具有相同的功能.

基本上,使用任何使代码最具可读性的东西.肯定有一个或另一个结构使得更清晰,更易读和更易于维护的地方.这远比在JavaScript代码中节省几纳秒更重要.

  • 重要的是编写干净,可维护的代码.当出现性能问题时 - 个人资料.然后确定要修复的代码.不要因牺牲性能问题而牺牲可维护性. (6认同)
  • 特别是在javascript中,语义和可读性(以及可维护性)胜过由独特的浏览器版本计算机硬件和操作系统组合引起的`if..else`和`switch`之间的任何本地化性能差异. (5认同)
  • 'if else if else ...'是O(n),而'switch'是O(1)或O(log(n)).你怎么能诚实地说出差异永远不够大?在交换机中有一百万个案例(如果生成代码则很容易),你肯定会注意到它至少. (3认同)
  • 我反对这一点,因为我认为回答第一个问题的概括是不正确的。 (3认同)
  • 我不知道我是否同意,如果将它与大型数据库,遍历树等一起循环使用,可能确实会注意到它。 (2认同)
  • 我绝对不同意。随着Web应用程序变得越来越复杂,这种差异对于应用程序而言可能很重要,并且可能会因浏览器而异。 (2认同)

Eva*_*oll 6

除了语法之外,可以使用树来实现切换O(log n),而if/else必须使用O(n)过程方法来实现.更常见的是,它们都是在程序上处理的,唯一的区别是语法,而且它真的很重要 - 除非你静态输入10k if/else案例吗?

  • 7年后......我不明白树的实现是如何可能的,除了在恒定数值的情况下)。 (2认同)