JS三元运营商混乱

use*_*194 3 javascript ternary operator-keyword

我现在正在学习三元运算符.我得到了基础知识,但后来我看到了这个片段,这对我没有任何意义.任何人都可以解释它是如何组合在一起的?!

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);
Run Code Online (Sandbox Code Playgroud)

bm&4 || 根据我的理解是位操作,然后(c | = 2,另一个位操作,但逗号是什么意思?!

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

转化为

if(a> = 63 && a <= 77){a = 65} else {a = 48; }

然后在那之后<= a && 57> = a?a = 48:c&1?97 <= a对我没有任何意义.因为48是前一个声明.任何人都可以

Li0*_*liQ 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
Run Code Online (Sandbox Code Playgroud)

试图在if-else fasion中重写它将产生以下结果:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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