Javascript 理解三元算子

Javascript 理解三元算子,javascript,ternary,Javascript,Ternary,我有以下代码: c.m & 3 || (b |= 2, 65 <= a && 90 >= a ? a = 65 : 48 <= a && 57 >= a ? a = 48 : b & 1 ? 97 <= a && 122 >= a ? a = 65 : 197 == a || 229 == a ? b &= 5 : 192 <= a && 687 >= a

我有以下代码:

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

我甚至不知道从哪里开始。| |是二进制运算符吗?为什么开头有逗号?我想了解这段代码是如何工作的,并使用常规的if重写它,否则,有什么提示吗?谢谢

如果第一个操作数是真的,则
|
运算符返回第一个操作数,否则返回第二个操作数<代码>&&的作用正好相反:如果第一个操作数是falsy,则返回第一个操作数,否则返回第二个操作数

a?b:c
的简写形式(函数(a){if(a)返回b;else返回c;}(a);
(不完全正确,但无论如何这就是它的意思)

运算符计算其两个操作数并返回第二个操作数

考虑到所有这些,上述代码变成:

if( !(k & 3)) {
    b |= 2;
    if( 65 <= a && 90 >= a)
        a = 65;
    else if( 48 <= a && 57 >= a)
        a = 48;
    else if( b & 1) {
        if( 97 <= a && 122 >= a)
            a = 65;
        else if( 197 == a || 229 == a)
            b &= 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 = 106;
        else if( 127 <= a)
            b &= 5;
        else if( 33 <= 1)
            a = 59;
        else
            b &= 5;
    }
    else if( 48 > a)
        b &= 5;
    else if( 65 > a)
        a = 59;
    else if( 96 > a)
        b &= 5;
    else if( 112 > a)
        a = 96;
    else if( 187 > a)
        b &= 5;
    else
        a = 59;
}
if(!(k&3)){
b |=2;
如果(65=a)
a=65;
否则,如果(48=a)
a=48;
如果有的话(b&1){
如果(97=a)
a=65;
else if(197==a | | 229==a)
b&=5;
否则如果(192=a)
a=192;
若否(1536 a)
b&=5;
其他的
a=59;
}

不过,我不能告诉你它的意思。它只是一组被检查的数字。
a
在多个范围内被检查,并被设置为特定值,或者
b
可能会被更改。这对我来说是一个巨大的混乱,它需要上下文来理解。

双管道表示和双安培表示
此外,?:语法是if/else的快捷方式

所以

可以这样写

a == 3 ? alert('a is 3') : alert('a is NOT 3');

与单管和符号(可以与其他一些查询运算符组合,如equals-
=
)一样,它们是位运算符,不处理返回布尔值的直接条件,如if(a==3)等

需要注意的是,在检查值是否未定义时,也可以使用double-pipe。因此,它显然将类型转换为布尔值。下面是一个示例

// note that val is not defined yet
var val = num || 0;
// so val will be assigned 0. same as:
if (typeof num == 'undefined') val = 0;
else val = num;
这段代码很糟糕,没有其他的词。它似乎是一些模糊处理的结果。我知道你想知道这段代码是如何工作的,但模糊处理代码的全部要点是,要想解决它,要么是不可能的,要么是极其困难的。
然而,在我看来,知道所有操作符是什么,以及它们做什么,是最好的开始。各种操作员的完整参考资料

首先是:
k&3
将返回
0
1
3
。为什么?因为
&
返回一系列左右操作数“共享”的位
请考虑以下几点:

| integer | binary |
====================
|    1    |  0001  |
|    2    |  0010  |
|    3    |  0011  |
|    4    |  0100  |
--------------------

因此,
1&3
等于
1
,因为两个操作数中只有第一位是“开”的(
000>1<&001>1从变量名来看,这看起来像是缩小了的代码。您有机会访问原始的、未缩小的源代码吗?您有一个没有人可以跟随的长水平滚动的代码段。我尝试过编辑,但发现很难。从阅读JavaScript中的运算符优先级和关联性开始。这将允许要分离运算符,请建立所执行操作的树,并清楚地查看计算的内容和时间。
|
是二进制(逻辑或),而
分隔多个表达式并返回最后一个表达式的值。@Mrusful它被标记为@Mrusful您可能想戴上眼镜。很好,非常感谢,我真的很感激!!+1为完整地写出代码段而费了不少功夫。您是自己做的,还是使用了工具/脚本来完成这项工作如果是这样的话:我在哪里可以找到这个工具?(我目前正在编写一些代码,这些代码似乎是由对
if
else
有恐惧心理的人编写的)没问题。别忘了,为了准确起见,可能需要在多个三元运算符中使用括号。
// note that val is not defined yet
var val = num || 0;
// so val will be assigned 0. same as:
if (typeof num == 'undefined') val = 0;
else val = num;
| integer | binary |
====================
|    1    |  0001  |
|    2    |  0010  |
|    3    |  0011  |
|    4    |  0100  |
--------------------
if (x)//truthy
{
    a;
}
else
{
    b;
}
if (k & 3)
{//will be true if either the first, second or both the second and first bits are set on k
    k & 3;
}
else
{//if k is 4, for example
    all the other stuff
}