在三元运算中,值为负范围和正范围,直到0?

时间:2012-03-13 13:59:41

标签: javascript optimization coding-style ternary-operator

我遇到了一个我想解决的问题。 只要x为正

,此表达式就可以正常工作
x > 0 ? x - y : x + y;

当它变为负数时,这就是问题开始的地方。 所以我想到了

x !=0 & x < 0 ? x - y : Math.abs(x - y)*-1) 

但这让我无处可去,我解决了它:

if (x > 0 && x - y > 0) {
    x -= y;
} else if (x < 0 && x + y > 0) {
    x += y;
} else {
    x = 0;
}
然而,这很长,看起来并不优雅。 有什么方法可以通过三元运算缩短效率?

5 个答案:

答案 0 :(得分:2)

x = x >=0 ? x - y : x + y;
x = x < 0 ? 0 : x;

x = Math.max(x >= 0 ? x - y : x + y, 0);

答案 1 :(得分:1)

试试这个

x = !x? 0 : Math.max(0, x-y*(Math.abs(x)/x));

答案 2 :(得分:0)

是的,您可以使用条件(也称为三元)运算符编写相同的内容:

x =
  x > 0 && x - y > 0 ? x - y :
  x < 0 && x + y > 0 ? x + y :
  0;

或将零点检查分开:

x =
  x > 0 ? x - y :
  x < 0 ? x + y :
  0;
x = x > 0 ? x : 0;

答案 3 :(得分:0)

我不知道你为什么要做你正在做的事情,但你不能简单地做:

Math.max(x < 0 && x + y > 0 ? x + y : x - y, 0)

这似乎和你的if语句一样。

答案 4 :(得分:0)

以上答案都解决了你的问题,但说明了我认为三元表达式的一个主要问题 - 它们经常导致代码难以理解。这就是我很少使用它们的原因。

我认为你用if / else语句编写的代码是迄今为止最好的解决方案。我已经编程超过40年了,相信我,你应该总是喜欢编写易于理解的代码,这些代码应该是“优雅”的代码。这将为您节省大量时间,特别是当您在很长一段时间后回到代码并忘记您想要做的事情时。