Javascript切换与if … else if … else

伙计们,我有几个问题:

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

问这个问题的原因是,似乎我在Firefox上的大约1000个案例的switch语句上得到了更好的性能。


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

 CreateConditionals(string name, string arrayofvalues, string arrayofActions) 

注意arrayofvalues是逗号分隔列表。

它产生的是

 function [name] (value) { if (value == [value from array index x]) { [action from array index x] } } 

注意:where [name] =传入serverside函数的名字

现在我改变了要插入到TextArea中的函数的输出,编写了一些JavaScript代码来parsing函数,并将其转换为一组case语句。

最后我运行的function,它运行良好,但IE和Firefox的性能不同。

概括地回答:

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

testing网站

有时最好不要使用。 例如,在“派遣”的情况下,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(); } 

通过创build对象来设置多路分支具有许多优点。 您可以dynamic添加和删除function。 您可以从数据创build调度表。 您可以通过编程来检查它。 您可以使用其他函数构build处理程序。

有一个函数调用的额外的开销,以获得相当于一个“案件”,但有一个哈希查找的优势(当有很多情况下)find一个特定的键的function。

switchif...else if...else之间的性能差别if...else if...else很小,他们基本上做同样的工作。 他们之间可能有所不同的一个区别是,要testing的expression式只在switch进行一次评估,而对每个if进行评估。 如果评估expression的代价是昂贵的,那么做一次当然比做一百次更快。

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

由于您几乎无法在所有浏览器中testing所有代码,因此您应该select最适合您所做工作的代码,并尽量减less所做的工作量,而不是优化工作量。

除了语法之外,可以使用树来实现一个开关,使得它成为O(log n) ,而if / else必须用O(n)程序方法来实现。 更多的时候,它们都是程序处理的,唯一的区别就是语法,而且它真的很重要 – 除非静态地input10k个if / else的情况吗?

  1. 如果有差异,它永远不会被注意到。
  2. N / A
  3. 不,它们的function完全相同。

基本上,使用任何使代码最易读的方法。 确定的地方,其中一个或其他构造使清洁,更可读和更易于维护。 这更重要,可能会在JavaScript代码中节省几纳秒。

在switch语句和if … else if else之间是否存在Javascript的性能差异?

我不这么认为,如果你想防止多个if-else条件,那么switch是有用/短的。

switch和if … else if … else在浏览器中的行为是否不同? (FireFox,IE,Chrome,Opera,Safari)

所有浏览器的行为都是一样的:)

  1. 在某些情况下,工作台可能会导致一些非常小的差异,但是处理方式依赖于浏览器,所以不值得打扰
  2. 由于不同的处理方式
  3. 如果行为不同,那么你不能称之为浏览器

事实certificate,如果 – 否则如果通常比开关快

http://jsperf.com/switch-if-else/46

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

 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(); } 

如果map包含大量的条目,这可能会造成很大的开销。 最好只设置一次动作地图,然后每次使用已经创build的地图,例如:

 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(); }