0

我有以下代码:

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、任何提示来重写它?谢谢!

4

3 回答 3

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可能会改为更改。这对我来说是一个巨大的混乱,它需要上下文才能有意义。

于 2012-10-29T16:04:11.507 回答
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 - =)一样,它们是按位运算符,它们不处理诸如if (a == 3)返回布尔值的直接条件。

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

// 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;
于 2012-10-29T16:05:46.090 回答
2

这段代码很糟糕,没有别的词。这似乎是一些混淆的结果。我知道您想知道这段代码是如何工作的,但混淆代码的全部意义在于它要么不可能要么非常难以解决。
然而,了解所有运营商是什么以及他们做什么,是最好的起点,IMO。可以在 MDN 上找到各种运算符的完整参考

首先:按位运算符:
k & 3将返回0,13。为什么?因为&返回左右操作数“共享”
的一系列位考虑以下内容:

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

那么就理所当然地认为1 & 3equals ,因为在两个操作数 ( )中1只有第一位是“on” 。 您的代码段使用的另一个按位运算符是单管道:,在类似的表达式中。记住上表:在 3 中解析,返回 3。这是按位的:如果两个操作数中的任何一个设置为 ,则将每个位设置为。在结果值被赋值给的情况下,这就是赋值运算符的用途,所以如果是 1,将设置为 3,如果是 2 或 3,则什么都不会改变,依此类推。000>1< & 001>1<
|b |= 21 | 21 | 3OR11
b |= 2bbbb

除此之外,您还有一堆嵌套的三元 ( 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 参考并了解各种运营商。一旦你了解了它们,就好像发现了正则表达式:一个广阔的、令人兴奋的可能性领域展开了,之前需要很多很多行代码的东西突然可以只使用一个运算符来编写。

于 2012-10-29T16:21:25.867 回答