Javascript切换与if … else if … else
伙计们,我有几个问题:
- 在
switch
语句和if...else
之间JavaScript有性能差异吗? - 如果是这样的话
- 在浏览器中,
switch
和if...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的性能不同。
概括地回答:
- 是的,通常。
- 在这里看到更多信息
- 是的,因为每个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。
switch
和if...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的情况吗?
- 如果有差异,它永远不会被注意到。
- N / A
- 不,它们的function完全相同。
基本上,使用任何使代码最易读的方法。 确定的地方,其中一个或其他构造使清洁,更可读和更易于维护。 这更重要,可能会在JavaScript代码中节省几纳秒。
在switch语句和if … else if else之间是否存在Javascript的性能差异?
我不这么认为,如果你想防止多个if-else
条件,那么switch
是有用/短的。
switch和if … else if … else在浏览器中的行为是否不同? (FireFox,IE,Chrome,Opera,Safari)
所有浏览器的行为都是一样的:)
- 在某些情况下,工作台可能会导致一些非常小的差异,但是处理方式依赖于浏览器,所以不值得打扰
- 由于不同的处理方式
- 如果行为不同,那么你不能称之为浏览器
事实certificate,如果 – 否则如果通常比开关快
Pointy的答案build议使用对象文字作为switch
或if
/ 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(); }