请解释这个奇怪的Javascript代码行

3

我发现了一段代码,它是这样的:

for(i=((90.0E1,0x5A)<=(0x158,140.70E1)?(.28,3.45E2,0):(95.30E1,26.40E1)<=1.400E2?(1,this):(108.,0x227));i<length;i++) { 
   // some other code here
} 

有人能帮我解释一下for()括号里的东西吗?


3
希望你在正式的代码中没有遇到这种污秽的东西! - Will A
这个网站提供的混淆功能:https://jscrambler.com/ - mplungjan
3个回答

5
逗号运算符的结果总是右侧的值。因此,每个形式为(a,b)的对都会评估为b。由于在您的代码中,“a”从未产生副作用,因此我们可以简单地省略它,以获取:
for(i=(0x5A <= 140.70E1 ? 0 : ...);i<length;i++) { 

这里的 "..." 表示不重要的内容: 由于 0x5A <= 140.70E1 的结果是 true,因此条件运算符 ?: 的结果是问号右侧的值,即 0。

因此,结果相当于

 for (i=0; i<length; i++) { 

这很有道理。

2

这是一个标准的三表达式 for 语句,其中第一个表达式,即初始化器,被定义为

i = ((90.0E1,0x5A)<=(0x158,140.70E1)?(.28,3.45E2,0):(95.30E1,26.40E1)<=1.400E2?(1,this):(108.,0x227))

在这个表达式中,三目运算符?:被嵌套使用,使得事情变得更加复杂。 ?:运算符的语法如下:
condition ? value if true : value if false 

鉴于此,该表达式由以下内容组成。
condition:      (90.0E1,0x5A)<=(0x158,140.70E1)
value if true:  (.28,3.45E2,0)
value if false: (95.30E1,26.40E1)<=1.400E2?(1,this):(108.,0x227)

value-if-false使用?:运算符包含一个嵌套表达式,当然也可以以同样的方式进行分解。


0

简化十六进制和 E 数字,变成:

for(i=((900,90)<=(344,1407)?(.28,345,0):(953,264)<=140?(1,this):(108.,551));i<length;i++)

((900,90)<=(344,1407)?(.28,345,0):(953,264)<=140?(1,this):(108.,551)) == 0;

这使得代码等价于:

for(i=0;i<length;i++)

这是一种非常有创意和具有迷惑性的制作 for 循环的方式,也是一个好笑话。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接