Пожалуйста, объясните эту странную строку Javascript - PullRequest
3 голосов
/ 25 июля 2010

Я наткнулся на кусок кода, который:

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 ]

5 голосов
/ 25 июля 2010

Результатом оператора запятой всегда является значение справа. Таким образом, каждая пара вида (a, b) оценивается как b. Так как в вашем коде «а» никогда не имеет побочного эффекта, мы можем просто опустите его, чтобы получить:

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

Где "..." означает вещи, которые не имеют значения: Так как 0x5A <= 140.70E1 оценивается как <code>true, результатом оператора ?: является значение справа от знака вопроса, то есть 0.

Таким образом, результат эквивалентен

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

что имеет смысл.

2 голосов
/ 25 июля 2010

Это стандартное выражение с тремя выражениями for, в котором первое выражение, инициализатор, определено как

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

В этом выражении троичное ?:*Оператор 1007 * и, что усложняет, делает это во вложенном виде.

Синтаксис оператора ?: следующий:

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)

Значение-if-false содержит вложенное выражение, используя оператор ?:, который, конечно, может быть деконструирован таким же образом.

0 голосов
/ 25 июля 2010

Упрощая шестнадцатеричные и 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 петля и хорошая шутка.

...