我需要检查用户写的日期是否有效,所以我想知道什么会更快?
if(dayOfManth > 12 || dayOfManth < 1) { return false; }
return true;
或
if(MonthOfYear > 12) { return false; }
if(MonthOfYear < 1) { return false; }
return true;
DayOfMonth(1-31)和其他人(年份范围,短月,FEB闰日等)也是如此。
什么会更快?
答案 0 :(得分:5)
只需使用:
return dayOfMonth >= 1 && dayOfMonth <= 12
这是最具可读性的。在这种情况下,性能可以忽略不计。不要微观优化。
答案 1 :(得分:2)
正如您对问题的评论已经说过,表现不应该是一个问题。所以可读性应该是王道。
根据您对问题的评论:
有很多检查,因此无法读取
然后我建议您使用这样的选项来拆分布尔表达式:
function someFunction(dayOfMonth, someOtherValue) {
var result = true;
result &= dayOfMonth >= 1;
result &= dayOfMonth <= 12;
result &= someOtherValue == 6;
return result;
}
alert(someFunction(7, 6) ? "true" : "false"); // true
alert(someFunction(13, 6) ? "true" : "false"); // false
alert(someFunction(7, 5) ? "true" : "false"); // false
这使用布尔&=
运算符来表示“如果结果仍为真,且此表达式也为真,则将结果设置为true。否则将其设置为false”。
除了性能之外,这将允许你将所有表达式分开,但仍然让它们可读,并让你尽可能避免重复自己。
为了便于阅读,我仍然会在有意义的时候组合表达式,而不是在每一行上放置一个表达式。我这里只是为了演示它是如何工作的。
答案 2 :(得分:0)
始终选择更能表达您意图的选项。在这种情况下,我发现第一个比第二个更清晰,尽管这是主观的。
除此之外,我还会使用一些表格验证框架,这样你就不必重新发明轮子了。
修改强>
从未尝试过,但看起来很有希望: http://docs.jquery.com/Plugins/Validation
答案 3 :(得分:0)
如果这是用户输入验证,那么这种微优化就不会引人注意,你应该像其他人所建议的那样努力获得代码可读性和可维护性。
现在回答你的问题。我不相信有任何区别。我希望唯一可能的优化(在X86架构上,对其他人来说不能说)是你是否可以在不使用条件跳转的情况下编译逻辑表达式,从而避免不必要的branch mispredictions。我不认为这可以做到,因为你正在使用比较。如果您有兴趣了解有关此类优化的更多信息,我衷心建议您阅读Intel® 64 and IA-32 Architectures Optimization Reference Manual
答案 4 :(得分:0)
它们完全相同。这似乎是短路评估的错误案例 [Wikipedia]。
JavaScript使用(实际上只有)短路评估 - 如果第一个操作数返回所需的最小条件:
合乎逻辑的OR:
true || (true/false)
- 只需要第一个做真正的短路(最佳方案);
false || true
- 现在评估第二个,因为第一个(最糟糕的情况);
逻辑AND:
false && (true/false)
- 无论第二个是什么,结果都是错误的。第二个条件未评估(最佳方案);
true && true
- 评估两者(最糟糕的情况)。
我还做了一点example - 第二个测试显示了一个额外的警报(),因为评估了第二个“条件”。