Javascript switch vs if... else if... else

伙计们,我有几个问题:

  1. 在 JavaScript 中,switch语句和 if...else语句之间是否存在性能差异?
  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]
}
}

注意: 其中 [name] = 传递到 serverside 函数的名称

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

最后我运行了这个函数,它运行得很好,但是 IE 和 Firefox 的性能有所不同。

154217 次浏览

是否有一个性能差异 Switch 语句之间的 Javascript 还有如果,如果,如果,如果?

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

是开关和 如果... 如果... 如果不一样的话 浏览器? (FireFox,IE,Chrome,Opera, 旅行)

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

  1. 如果有区别,它永远不会大到足以引起注意。
  2. 不知道
  3. 不,它们的功能完全一样。

基本上,使用代码最易读的部分。在某些地方,一种或另一种构造使得更清晰、更易读、更易维护。这比在 JavaScript 代码中节省几纳秒要重要得多。

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

除了语法之外,开关可以通过使其成为 O(log n)的树来实现,而 如果/否则必须通过 O(n)过程方法来实现。更常见的情况是,它们都是按过程处理的,唯一的区别是语法,而且这真的有关系吗——除非您静态地键入10k 种 if/else 情况?

有时候两者都不用更好。例如,在“分派”的情况下,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();
}

通过创建对象来设置多路分支有很多优点。您可以动态地添加和删除功能。您可以根据数据创建分派表。您可以通过编程方式检查它。您可以使用其他函数构建处理程序。

函数调用的额外开销相当于“ case”,但是散列查找的优点(当有很多 case 时)在于查找特定键的函数。

switchif...else if...else之间的性能差异很小,它们基本上做同样的工作。它们之间的一个差异可能会产生差异,那就是要测试的表达式在 switch中只计算一次,而在每个 if中只计算一次。如果计算表达式的开销很大,那么一次计算当然比一百次计算要快。

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

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

结果是 if-else 通常比 switch 快

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

Pointy 的回答 建议使用对象文字作为 switchif/else的替代。我也喜欢这种方法,但是答案中的代码在每次调用 dispatch函数时都会创建一个新的 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包含大量的条目,这会造成很大的开销。最好只设置一次操作映射,然后每次都使用已经创建的映射,例如:

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