三元运算符中的三元运算符是否可能

Are ternary operators in ternary operatory possible

为什么这条线不起作用

        x > highNum ? highNum = x : y > highNum ? highNum = y : highNum = highNum

在这种情况下,这条线是一个循环,x 和 y 每次都不一样。我试图在最后找到最高的数字,并认为这会奏效。 在我看来,这是这样写的: 如果 x 高于 high num 应为 highnum 分配 x 的值 如果不。 你更大吗? 如果是,y 应该是新的 highnum。 如果不。 不要改变 high num

是的,但您需要括号,主要是为了便于阅读:

(x > highNum) ? (highNum = x) : ((y > highNum) ? (highNum = y) : (highNum = highNum));

在您的情况下,您最好将其拆分为多个语句以防止混淆:

if (x > highNum) {
    highNum = x;
} else if (y > highNum) {
    highNum = y;
}

尽管这不适合单个表达式,但也许这表明您的代码有点过分了 complex/unreadable。

如果您只想寻找最大的数字,也许 Math.max 就是您所需要的,即 Math.max(x, y, highNum).

简答:

是的,他们是。

长答案:

是的,但您也应该关注可读性。您的代码完全按照您的期望执行,但其他开发人员(也许将来您)可能无法理解这一点,因此我强烈建议您永远不要使用嵌套的三元运算符,并且仅在以下情况下使用它们它比简单的 if else 语句更有意义。 如果即使在这之后您仍然想使用它,至少添加一条评论来解释它的作用。例如:

  let highNum
  for(let line of lines){
     const {x, y} = line; 
     // use bubble sort to find the highest number
     x > highNum ? highNum = x : y > highNum ? highNum = y : highNum = highNum
  }
  

编辑:此外,正如“trincot”所说,这也没有正确找到最高数字

If x is higher than high num highnum should get assigned the value of x if not. is y bigger? if yes y should be the new highnum. if not. dont change high num

那就是:

highNum = (x > highNum) ? x : ((y > highNum) ? y : highNum)
           [condition] ?[true]:         [false]
                              ([condition] ? [true] : [false]) // Evaluated if the first condition was false

结构是variable = [condition] ? [value for true] : [value for false]

并且您可以使用额外的括号来嵌套三元而不是 [value]

这等同于:

if(x > highNum) {
  highNum = x
} else if(y > highNum) {
  highNum = y
} else {
  highNum = highNum // Quite useless... That is for explanation purpose ;)
}

您可能会错过一个潜在的高值:当 x > highNumy > x 时,您不会看到 y 确实是最高的,因为表达式会已经决定 highNum 应该得到 x.

的值

你可以用 Math.max 很简单地做到这一点:

highNum = Math.max(x, y, highNum);

您还必须考虑 y>x 个实例。

highNum = (x > y) ? (x > highNum ? x : highNum) :(y > highNum ? y : highNum);

以上等于以下:

if (x>y) {
    if (x>highNum) {
        highNum = x;
    } else {
        highNum = highNum;
    }
} else { //covers both instances of y>x and x=y
    if (y>highNum) {
        highNum = y;
    } else {
        highNum = highNum;
    }
}