请解释一下这个奇怪的 JavaScript 行

发布于 2024-09-10 23:57:43 字数 236 浏览 10 评论 0原文

我遇到了一段代码:

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() 括号中的内容吗?

I came across a piece of code that is:

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
} 

Can someone help me by explaining the stuff in the for() brackets?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

杀手六號 2024-09-17 23:57:43

逗号运算符的结果始终是右手边。
因此 (a,b) 形式的每一对都计算为 b。由于在您的代码中“a”永远不会产生副作用,因此我们可以
只需省略它即可:

for(i=(0x5A <= 140.70E1 ? 0 : ...);i<length;i++) { 

其中“...”代表无关紧要的东西:
由于 0x5A <= 140.70E1 计算结果为 true,因此 ?: 运算符是问号右侧的值,即 0。

所以结果相当于

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

which 有意义。

The result of the comma operator is always the value to the right hand side.
So each pair of the form (a,b) evaluates to b. Since in your code "a" never has a side effect, we can
simply omit it to get:

for(i=(0x5A <= 140.70E1 ? 0 : ...);i<length;i++) { 

Where "..." stands for stuff that doesn't matter:
Since 0x5A <= 140.70E1 evaluates to true, the result of the ?: operator is the value to the right of the question mark, i.e. 0.

So the result is equivalent to

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

which makes sense.

小清晰的声音 2024-09-17 23:57:43

它是一个标准的三表达式 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 使用 ?: 运算符保存嵌套表达式,其中当然可以用同样的方式解构。

It is a standard three-expression for statement, where the first expression, the initializer, happens to be defined as

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

In this expression, the ternary ?: operator, and, to complicate things, does this in a nested fashion.

The syntax of the ?: operator is the following

condition ? value if true : value if false 

Given this, the expression is composed of the following

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)

The value-if-false holds a nested expression using the ?: operator which can of course be deconstructed in the same way.

橘虞初梦 2024-09-17 23:57:43

简化十六进制和 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 循环方式,也是一个很好的笑话。

Simplifying the hex and E numbers, it becomes:

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;

which makes the code equivalent to:

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

It's a very creative and confusing way to make a for loop, and a good joke.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文