伙计们我有几个问题:
switch
语句与if...else
之间的JavaScript存在性能差异吗? switch
和if...else
的行为是否有所不同? (FireFox,IE,Chrome,Opera,Safari)提出这个问题的原因似乎是我在switch
语句中获得了更好的性能,在Firefox中有大约1000个案例。
被修改 不幸的是,这不是我的代码,Javascript正在从编译库生成服务器,我无法访问代码。生成javascript的方法称为
CreateConditionals(string name, string arrayofvalues, string arrayofActions)
note arrayofvalues
是逗号分隔列表。
它产生的是
function [name] (value) {
if (value == [value from array index x]) {
[action from array index x]
}
}
注意:[name]
=传递给服务器端函数的名称
现在我将要插入的函数的输出更改为TextArea,编写了一些JavaScript代码来解析函数,并将其转换为一组case
语句。
最后我运行该功能并且运行正常,但IE和Firefox的性能不同。
答案 0 :(得分:95)
回答一般性问题:
答案 1 :(得分:57)
有时最好不要使用它。例如,在“调度”情况下,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”的开销,但是哈希查找的优势(当有很多情况时)才能找到特定键的函数。
答案 2 :(得分:17)
switch
和if...else if...else
之间的效果差异很小,它们基本上做同样的工作。它们之间可能产生差异的一个区别是,要测试的表达式仅在switch
中评估一次,而对每个if
进行评估。如果评估表达式的成本很高,那么这样做一次当然比做一百次更快。
这些命令(以及一般所有脚本)的实现差异在浏览器之间有很大差异。对于不同浏览器中的相同代码,通常会看到相当大的性能差异。
由于您几乎无法对所有浏览器中的所有代码进行性能测试,因此您应该选择最适合您所做工作的代码,并尝试减少完成的工作量,而不是优化完成工作的方式。
答案 3 :(得分:6)
基本上,使用任何使代码最具可读性的东西。肯定有一个或另一个结构使得更清晰,更易读和更易于维护的地方。这远比在JavaScript代码中节省几纳秒更重要。
答案 4 :(得分:6)
除了语法之外,可以使用树使O(log n)
实现切换,而 if / else 必须使用O(n)
程序方法实现。更常见的是,它们都是在程序上处理的,唯一的区别是语法,而且它真的很重要 - 除非你静态输入10k if / else案例吗?
答案 5 :(得分:3)
是否存在表现差异 一个switch语句之间的Javascript 还有一个if ... else if .... else?
我不这么认为,如果你想要防止多个switch
条件,if-else
很有用/很短。
是开关的行为还是 if ... else if else 浏览器? (FireFox,IE,Chrome,Opera, Safari浏览器)
所有浏览器的行为都相同:)
答案 6 :(得分:3)
Pointy's answer建议使用对象文字作为switch
或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();
}
如果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();
}
答案 7 :(得分:1)
答案 8 :(得分:1)
事实证明,if-else如果通常比switch
快