【问题标题】:JS Ternary operator confusionJS 三元运算符混淆
【发布时间】:2012-02-13 13:24:31
【问题描述】:

我现在正在学习三元运算符。我掌握了基础知识,但后来我看到了这个 sn-p,这对我来说没有任何意义。谁能解释一下它是如何组合在一起的?!

b.m & 4 || (c |= 2, 63 <= a && 77 >= a ? a = 65 : 48 <= a && 57 >= a ? a = 48 : c & 1 ? 97 <= a && 122 >= a ? a = 65 : 197 == a || 229 == a ? c &= 5 : 192 <= a && 687 >= a ? a = 192 : 1536 <= a ? a = 1536 : 912 <= a ? a = 912 : 160 <= a ? a = 160 : 127 <= a ? c &= 5 : 33 <= a ? a = 59 : c &= 5 : 48 > a ? c &= 5 : 65 > a ? a = 59 : 96 > a ? c &= 5 : 112 > a ? a = 96 : 187 > a ? c &= 5 : a = 59);

bm & 4 || 据我了解是位运算,然后 (c |= 2, 另一个位运算,但是逗号是什么意思?!

然后有 63 = 一个? a = 65 : 48

翻译成

如果(a >= 63 && a

然后是 = a ? a = 48 : c & 1 ? 97 这对我来说根本没有任何意义。因为 48 是前面的语句。任何人都可以

【问题讨论】:

  • 那是一个漫长的操作。光看就头疼。我能帮你的只有comma operator

标签: javascript operator-keyword ternary


【解决方案1】:

逗号在javascript中是一个单独的operator

逗号运算符计算它的两个操作数(从左到右) 并返回第二个操作数的值。

你只掌握了表达的一部分:

然后有 63 = a ? a = 65 : 48

实际上它有点长(有一些格式):

63 <= a && 77 >= a
    ? a = 65
    : 48 <= a && 57 >= a
        ? a = 48
        : c & 1
            ? 97 <= a && 122 >= a
                ? a = 65
                : 197 == a || 229 == a
                    ? c &= 5
                    : 192 <= a && 687 >= a
                        ? a = 192
                        : 1536 <= a
                            ? a = 1536
                            : 912 <= a
                                ? a = 912
                                : 160 <= a
                                    ? a = 160
                                    : 127 <= a
                                        ? c &= 5
                                        : 33 <= a
                                            ? a = 59
                                            : c &= 5
            : 48 > a
                ? c &= 5
                : 65 > a
                    ? a = 59
                    : 96 > a
                        ? c &= 5
                        : 112 > a
                            ? a = 96
                            : 187 > a
                                ? c &= 5
                                : a = 59

尝试以 if-else 方式重写它会产生以下结果:

if (63 <= a && 77 >= a){
    a = 65
} else if (48 <= a && 57 >= a){
    a = 48
} else if (c & 1){
    if (97 <= a && 122 >= a){
        a = 65
    } else if (197 == a || 229 == a){
        c &= 5
    } else if (192 <= a && 687 >= a){
        a = 192
    } else if (1536 <= a){
        a = 1536
    } else if (912 <= a){
        a = 912
    } else if (160 <= a){
        a = 160
    } else if (127 <= a){
        c &= 5
    } else if (33 <= a){
        a = 59
    } else {
        c &= 5
    }               
} else {
    if (48 > a){
        c &= 5
    } else if (65 > a){
        a = 59
    } else if (96 > a){
        c &= 5
    } else if (112 > a){
        a = 96
    } else if (187 > a){
        c &= 5
    } else {
        a = 59
    }
}

注意 if-else 方法目前缺少返回值,而三元运算符确实返回最后执行的运算符的值(这可能会影响括号中布尔表达式的整体值)。

【讨论】:

  • 非常感谢!!是的,我刚开始只是想理解,但现在更容易理解了,谢谢!!!
【解决方案2】:

我更喜欢格式化嵌套的三元语句like this,因此它们具有简单易读的结构:

//   (is this true) ? then do this  
//   (is this true) ? then do this  
// (all else fails) : then do this

按照这个结构,它看起来像这样:

  63 <= a && 77 >= a ? a = 65
: 48 <= a && 57 >= a ? a = 48
:              c & 1 ? /* then go into this indented block below */
                         97 <= a && 122 >= a ? a = 65
:                       197 == a || 229 == a ? c &= 5
:                       192 <= a && 687 >= a ? a = 192
:                                  1536 <= a ? a = 1536
:                                   912 <= a ? a = 912
:                                   160 <= a ? a = 160
:                                   127 <= a ? c &= 5
:                                    33 <= a ? a = 59
                                  /* else */ : c &= 5
:            48 > a ? c &= 5
:            65 > a ? a = 59
:            96 > a ? c &= 5
:           112 > a ? a = 96
:           187 > a ? c &= 5
   /* final else */ : a = 59

【讨论】:

    【解决方案3】:

    逗号不是三元运算符,它允许两个表达式替换一个。

    但更重要的是,这是一团糟。分解、格式化和评论。除非您在打高尔夫球,否则将所有这些组合成一堆只是滥用。

    【讨论】:

      猜你喜欢
      • 2014-02-08
      • 2020-10-25
      • 2012-03-09
      • 2021-12-30
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 2018-04-01
      • 2012-09-15
      相关资源
      最近更新 更多