这样做有一种更明智的方式吗?

时间:2010-07-20 15:17:21

标签: javascript math

我似乎经常处理这样的特殊情况。必须有一个更简洁的语法或结构:

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缓存。

尽管如此,即使是“最慢”的方法仍然很快。

6 个答案:

答案 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);
祝你好运!