JS三目运算符混淆

3

我现在正在学习三元运算符。我掌握了基础知识,但是当我看到这段代码片段时,它对我来说毫无意义。请问有人可以解释一下它是如何组合的吗?!

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);

b.m & 4 || 是位运算,根据我的理解,(c |= 2, 是另一种位运算,但逗号代表什么?!

接下来是

63 <= a && 77 >= a ? a = 65 : 48

翻译为:

如果a大于等于63并且小于等于77,则a等于65,否则a等于48。

然后接下来是<= a && 57 >= a ? a = 48 : c & 1 ? 97 <= a ,我完全不理解它的含义。因为48是给前面那个语句用的。有人能帮忙吗?


哇,那是一个漫长的操作。看着就头疼。我只能帮你解释一下逗号运算符 - Matt K
3个回答

7

逗号在JavaScript中是一个独立的运算符

逗号运算符从左到右依次评估其两个操作数并返回第二个操作数的值。

你已经掌握了表达式的一部分:

然后是 63 <= a && 77 >= 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方法目前缺少返回值,而三元运算符确实会返回执行的最后一个操作数的值(这可能会影响括号内布尔表达式的整体值)。

非常感谢!我只是想理解开头,但现在更容易理解了,谢谢!! - user1002194

2

我更喜欢按照这种方式格式化嵌套三目运算符,这样它们具有简单易读的结构:

//   (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

1

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

但更重要的是,这是一团糟。将其分解、格式化并加注释。除非你在打高尔夫球,否则将所有内容合并成一堆只会让人感到不适。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接