我有以下代码:
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,任何提示重写它?谢谢!
答案 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
将返回0
,1
或3
。为什么?因为&
返回一系列位,左右操作数“共享”
请考虑以下内容:
| 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参考资料,即可了解各种运营商。一旦你了解了它们,就像找到正则表达式一样:一个巨大的,激动人心的可能性领域展开,突然之前可以使用一个运算符编写许多代码行的东西