代码之家  ›  专栏  ›  技术社区  ›  Matt Ball

有更巧妙的方法吗?

  •  16
  • Matt Ball  · 技术社区  · 14 年前

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

    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 . 原来彼得的速度快多了!每次运行1000000次迭代(我还运行了一个缓存 Math.max 版本,即使 max

    也就是说,即使是“最慢”的方法仍然相当快。

    6 回复  |  直到 7 年前
        1
  •  29
  •   Dave McClelland    14 年前

    怎么样

    var x = Math.max(solveForX(), 0);
    
        2
  •  10
  •   Vladimir    14 年前

    比如:

    x = Math.max(0, solveForX());
    
        3
  •  8
  •   Peter Ajtai    14 年前
    (x < 0) && (x = 0);
    

    这是一行,很清楚它的作用(在我个人看来)- 如果你熟悉布尔短路评估。

    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>
    
        4
  •  2
  •   viam0Zah    14 年前

    solveForX

    function returnNonNegative(fn) {
        function _f() {
            var x = fn();
            if (x < 0) {
                x = 0;
            }
            return x;
        }
        return _f;
    }
    
    solveForX = returnNonNegative(solveForX);
    

    在这种特殊情况下,使用 Math.max 看起来不错,但是这种模式为这类问题提供了一个通用的解决方案。

        5
  •  0
  •   s4y    14 年前

    公认的答案是完美的。如果您想在没有函数调用的情况下完成相同的任务,我认为这是最简洁的:

    var x;
    (x = solveForX()) > 0 || (x = 0);
    

    7% 快于 Math.max()

        6
  •  0
  •   Otroberts    13 年前

    我觉得这条路很不错!

    var x = Math.max(solveForX(), 0);
    

    祝你好运!