一个有点痛苦的三重嵌套三元运算符

Ell*_*lle 24 javascript if-statement ternary-operator

我查看了Raphael.js源代码,了解他如何将RGB值转换为HSB.我发现了他所做的功能,当我碰到这个漂亮的三嵌套三元运算符时,我正在将它转换为Python:

H = (C == 0 ? null :
    V == r ? (g - b) / C :
    V == g ? (b - r) / C + 2 :
             (r - g) / C + 4
    );
Run Code Online (Sandbox Code Playgroud)

它引发了我一个循环,因为Python没有Javascript所做的那种三元运算符.我花了一段时间查看它并最终将这个有点理智的代码(仅使用if/else)从中删除:

if (C == 0) {
    H = null;
} else {
    if(V == r) {
        H = (g - b) / C;
    } else {
        if(V == g) {
            H = (b - r) / C + 2;
        } else {
            H = (r - g) / C + 4;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的解释是否正确?我只是问这个,因为如果不正确,我会面临很多调试.所以.我"明白了"吗?

And*_*aus 29

根据我个人的喜好,精心对齐的嵌套三元组击败了if-esle的混乱:

const H =
  C == 0 ? null            :
  V == r ? (g - b) / C     :
  V == g ? (b - r) / C + 2 :
           (r - g) / C + 4 ;
Run Code Online (Sandbox Code Playgroud)

  • @Zydnar,我不知道,伙计。我刚刚在 Chrome 控制台中运行了一个简单的基准测试,if-then-else 速度较慢:https://i.imgur.com/Fqjyifl.png。无论使用哪种变体,单个操作大约需要“0.000000001”秒。那是纳秒,所以你们在这里争论皮秒的差异!如果您实时按程序生成数据,那么它可能很重要。然而,对于绝大多数 JS 开发人员来说,这种差异绝对可以忽略不计。但最重要的是代码的可读性和开发速度。 (2认同)

Jos*_*eph 27

我认为你可以这样做以避免深度嵌套:

var H

if(C == 0){
    H = null;
}
else if(V == r){
    H = (g - b) / C;
}
else if (V == g){
    H = (b - r) / C + 2;
}
else {
    H = (r - g) / C + 4;
}
Run Code Online (Sandbox Code Playgroud)

  • 当你在它的时候,为什么不使用一个不错的[truthy switch语句](/sf/ask/382505371/​​055603#9055603);) (4认同)
  • 哦,是的,我做 (3认同)

Lar*_*sen 8

如果您的 JavaScript 代码库包含与所讨论的类似的嵌套三元语句,请考虑将格式转换为菊花链三元语句

H = (C == 0)           // Is C zero?
    ? null             // Then return `null`, else ...
    : (V == r)         // Is V equal to r?
    ? (g - b) / C      // Then return this value, else ...
    : (V == g)         // Is V equal to g?
    ? (b - r) / C + 2  // Then return this value
    : (r - g) / C + 4; // Otherwise fall back to this default value
Run Code Online (Sandbox Code Playgroud)

他们只是沿直线从上到下读取,一旦遇到真实条件或回退,就立即返回一个值。

嵌套的三元组很棒,埃里克·埃利奥特


sso*_*mac 6

H = C == 0 
    ? null 
    : V == r 
        ? (g - b) / C 
        : V == g 
            ? (b - r) / C + 2 
            : (r - g) / C + 4
Run Code Online (Sandbox Code Playgroud)

我见过Dan Abramov使用这种缩进放置模式.虽然我不喜欢条件运算符?不再直观地遵循条件,但我更喜欢@Lolmaus的例子,因为无论条件的大小如何,缩进总是一致的.

实际上,你先来了解一下它作为?真正的:假是视觉上直观的在这里.通过这种方式,我发现三元组更容易发现并区别于周围的代码.


Ósc*_*pez 5

可以用更简单的方式编写相同的逻辑:

var H

if (C == 0)
    H = null;
else if (V == r)
    H = (g - b) / C;
else if (V == g)
    H = (b - r) / C + 2;
else
    H = (r - g) / C + 4;
Run Code Online (Sandbox Code Playgroud)

可以省略花括号,因为每个条件中都有一个语句.鉴于条件是相互排斥的,使用else if比嵌套更清晰if.

  • 人们普遍认为,不使用括号的空间/"清洁度"节省远远超过代码可维护性的危险含义.http://stackoverflow.com/a/2125078/205192 (3认同)
  • 很酷,谢谢。不过,我主要是在寻找逻辑验证,仅供参考。:) (2认同)