了解三元运算符

时间:2012-10-29 15:53:36

标签: 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 ? 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);

即使从哪​​里开始我也很困惑。是||二元运算符?为什么一开始有逗号?我想了解这段代码是如何工作的,并使用常规if,else,任何提示重写它?谢谢!

3 个答案:

答案 0 :(得分:12)

如果第一个操作数是真值,则||运算符返回第一个操作数,否则返回第二个操作数。 &&反之亦然:如果它是假的,则返回第一个操作数,否则返回第二个操作数。

a ? b : c(function(a) {if(a) return b; else return 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;
}
但是,我无法告诉你这意味着什么。这只是一堆数字被检查。 a会在多个范围内进行检查,并设置为特定值,或b可能会更改。对我来说这是一个巨大的混乱,它需要有意义的背景。

答案 1 :(得分:2)

双管表示 OR ,双号表示 AND
此外,?:语法是 if / else 的快捷方式。

所以

if (a == 3) alert('a is 3')
else alert('a is NOT 3')

可以写成

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

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

与单管道和符号符号(可以与其他一些查询运算符组合,例如equals - =)一样,它们是按位运算符,它们不处理直线条件,例如{{1等返回一个布尔值。

需要注意的是,在检查值是否未定义时,也可以使用双管道。所以它显然将类型转换为布尔值。这是一个例子。

if (a == 3)

答案 2 :(得分:2)

这段代码可怕,没有别的词。这似乎是一些混淆器的结果。我知道你想知道这段代码是如何工作的,但是混淆代码的全部意义在于它要么不可能,要么非常难以解决。
但是,知道所有运算符是什么,它们是做什么的,最好的起点,IMO。完整引用各种运算符is to be found here, on MDN

首先关闭:Bitwise operartors
k & 3将返回013。为什么?因为&返回一系列位,左右操作数“共享”
请考虑以下内容:

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

然后可以理所当然1 & 3等于1,因为在两个操作数(000>1< & 001>1<)中只有第一位是“on”
您的代码段使用的另一个按位运算符是单个管道|,位于b |= 2之类的表达式中。记住上面的表格:1 | 2在3中解析,1 | 3返回3.这是按位OR:如果两个操作数中的任何一个都有,则将每个位设置为1它设置为1
如果b |= 2结果值已分配给b,那就是赋值运算符的用途,因此如果b为1,则会设置b到3,如果b是2或3,则不会改变任何内容,依此类推。

除此之外,你有一堆嵌套的三元(x ? a : b),当完整写入时,它们是相同的:

if (x)//truthy
{
    a;
}
else
{
    b;
}

最后,最让你印象深刻的是开始时的逻辑运算符k & 3 ||...||只是一个逻辑。根据左操作数的结果值,使用左操作数或右操作数。同样,它简称:

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
}

只需花一些时间浏览MDN参考资料,即可了解各种运营商。一旦你了解了它们,就像找到正则表达式一样:一个巨大的,激动人心的可能性领域展开,突然之前可以使用一个运算符编写许多代码行的东西