我似乎经常处理这样的特殊情况。必须有一个更简洁的语法或结构:
var x = solveForX(); /* some slow calculation here */
if (x < 0)
{
x = 0;
}
这是等效的,但感觉不再优雅:
var x;
x = (x = solveForX()) < 0 ? 0 : x;
也许有一点转换技巧?
更新:我跑了some benchmarks来比较我最喜欢的两个答案 - 我接受的答案和Peter Ajtai's。事实证明彼得的速度要快得多!每个运行1,000,000次迭代(我还运行了一个缓存Math.max
的版本以查看查找贡献的时间)表明Peter的运行时间不到Math.max
版本的一半,即使{{1缓存。
尽管如此,即使是“最慢”的方法仍然很快。
答案 0 :(得分:29)
怎么样
var x = Math.max(solveForX(), 0);
答案 1 :(得分:10)
类似的东西:
x = Math.max(0, solveForX());
答案 2 :(得分:8)
(x < 0) && (x = 0);
编辑:删除了if语句。谢谢安德烈亚斯。
这是一行,很清楚它的作用(在我个人看来) - 如果你熟悉布尔短路评估。
以上内容使用了boolean short circuit evaluation。这在某些情况下非常有用(尤其是C ++中的指针运算,但布尔短路评估也适用于Javascript)。
x = 0
仅评估x < 0
。
以下是两个例子:
此警报1:
<script type="text/javascript">
var x = 1;
(x < 0) && (x = 0);
alert(x);
</script>
此警报0:
<script type="text/javascript">
var x = -1;
(x < 0) && (x = 0);
alert(x);
</script>
答案 3 :(得分:2)
我会装饰原始的solveForX
函数。
function returnNonNegative(fn) {
function _f() {
var x = fn();
if (x < 0) {
x = 0;
}
return x;
}
return _f;
}
solveForX = returnNonNegative(solveForX);
在这种特殊情况下,使用Math.max
似乎很好,但这种模式为这类问题提供了通用解决方案。
答案 4 :(得分:0)
接受的答案是完美的。如果你想在没有函数调用的情况下完成相同的操作,我相信这是最简洁的:
var x;
(x = solveForX()) > 0 || (x = 0);
(在Safari中,此实现比<{1}}快 7%,这可能不值得关注)
答案 5 :(得分:0)
我认为这种方式非常好!
var x = Math.max(solveForX(), 0);
祝你好运!