2010-07-25 4 views
3

я наткнулся на кусок кода, который:Пожалуйста, объясните этот странный Javascript линии

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 
} 

Может кто-то помочь мне объяснить вещи в течение() скобки?

+3

Надеюсь, вы не столкнулись с этой грязью в правильном коде! –

ответ

5

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

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

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

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

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

, который делает себе NSE.

+0

Никогда не знал о использовании запятой в javascript, спасибо! –

4

Обфускация обеспечивается этой страницы:

http://jscrambler.com/index/javascript_obfuscator_features

+0

Я вижу ... Тем не менее, я пытался узнать о конструкциях, которые использовались в цикле for, которым я не знаю, как интерпретировать. –

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) 

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

0

Упрощая шестигранные и Е число, оно становится:

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 петлю, и хорошая шутка.

Смежные вопросы