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

Mat*_*all 16 javascript math

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

var x = solveForX(); /* some slow calculation here */
if (x < 0)
{
    x = 0;
}
Run Code Online (Sandbox Code Playgroud)

这是等价的,但感觉不再优雅:

var x;
x = (x = solveForX()) < 0 ? 0 : x;
Run Code Online (Sandbox Code Playgroud)

也许有一点转换技巧?


更新:我运行了一些基准来比较我最喜欢的两个答案 - 我接受的答案和Peter Ajtai的答案.事实证明彼得的速度要快得多!每个运行1,000,000次迭代(我还运行了一个缓存版本Math.max以查看查找贡献了多少时间),表明Peter在Math.max版本的一半时间内运行,即使使用max缓存也是如此.

也就是说,即使是"最慢"的方法仍然很快.

Dav*_*and 29

怎么样

var x = Math.max(solveForX(), 0);
Run Code Online (Sandbox Code Playgroud)

  • FWIW,虽然这更简洁,作为代码的读者,这种形式比OP的原始形式花了几秒钟来解析. (6认同)
  • 你是否故意在评论中第二次输入`min(x,0)`?看起来像是一个容易意外逆转的习语. (6认同)
  • 不是最清楚的事情,使用`Math.max`来实现最小值. (3认同)
  • @Andreas - 呵呵....我相信这就是所谓的"游戏,设置和匹配"给@Chris;)因为他的意思是不小心使用`min`会是这种方法常见的拼写错误.....即使这是一个非常好的解决方案. (3认同)

Vla*_*mir 10

就像是:

x = Math.max(0, solveForX());
Run Code Online (Sandbox Code Playgroud)


Pet*_*tai 8

(x < 0) && (x = 0);
Run Code Online (Sandbox Code Playgroud)

编辑:删除了if语句.谢谢Andreas.

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

以上利用布尔短路评估.这在某些情况下非常有用(尤其是C++中的指针运算,但布尔短路评估也适用于Javascript).

x = 0只评估是否x < 0.

这是两个例子:

这警报1:

<script type="text/javascript">
    var x = 1;
    (x < 0) && (x = 0);
    alert(x);
</script>
Run Code Online (Sandbox Code Playgroud)

这提醒0:

<script type="text/javascript">
    var x = -1;
    (x < 0) && (x = 0);
    alert(x);
</script>
Run Code Online (Sandbox Code Playgroud)

  • @kingjeffre:这在Lisp中比Ruby更常见,我喜欢它. (3认同)
  • x = 0将始终指定永不评估 (2认同)
  • 我对此很困惑.此外,它是一个带有空体的if语句 - 所以无论如何都没有必要进行测试. (2认同)
  • 这个应该完美地工作(只要JavaScript采用布尔短路评估 - 我不太了解JS).但它比**标准**'max(x,0)`方法更清晰*.不过,我会给出一个+1来弥补无法解释的downvote. (2认同)
  • @Peter:嗯,我只是不知道为什么你会使用那种短路结合空的`if`体而不是通常的结构.但是嘿 - 我没有回答你的回答. (2认同)
  • +1这在Ruby中比JavaScript更常见,但我喜欢它! (2认同)