2012-01-18 3 views
3

Теперь я узнаю о тройных операторах. Я убрал основы, но потом увидел этот фрагмент, и это не имеет никакого смысла для меня. Может кто-нибудь объяснить, как это соединить?Путаница оператора JS Ternary

b.m & 4 || (c |= 2, 63 <= a && 77 >= a ? a = 65 : 48 <= a && 57 >= a ? a = 48 : c & 1 ? 97 <= a && 122 >= a ? a = 65 : 197 == a || 229 == a ? c &= 5 : 192 <= a && 687 >= a ? a = 192 : 1536 <= a ? a = 1536 : 912 <= a ? a = 912 : 160 <= a ? a = 160 : 127 <= a ? c &= 5 : 33 <= a ? a = 59 : c &= 5 : 48 > a ? c &= 5 : 65 > a ? a = 59 : 96 > a ? c &= 5 : 112 > a ? a = 96 : 187 > a ? c &= 5 : a = 59); 

b.m & 4 || битовые операции, насколько я понял, то (с |? = 2, другой операцией немного, но что запятая значит ?!

Тогда есть = а & & 77> = а а = 65: 48

который переводит к

, если (а> = 63 & & < = 77) { а = 65 } еще { a = 48; }

, а затем после этого приходит < = а & & 57> = а? a = 48: c & 1? 97 < = a, который вообще не имеет для меня никакого смысла. потому что 48 был для предыдущего заявления. Может кто-нибудь

+0

человек, который длинный операция. головная боль просто смотрит на нее. все, что я могу вам помочь, это [comma operator] (https://developer.mozilla.org/en/JavaScript/Reference/Operators/Comma_Operator). –

ответ

7

Запятая в JavaScript отдельный operator:

Оператор запятая вычисляет оба операнда (слева направо) и возвращает значение второго операнда.

Вы захватили только часть выражения:

Тогда есть 63 < = а & & 77> = а? а = 65: 48

На самом деле она немного длиннее (с некоторым форматированием):

63 <= a && 77 >= a 
    ? a = 65 
    : 48 <= a && 57 >= a 
     ? a = 48 
     : c & 1 
      ? 97 <= a && 122 >= a 
       ? a = 65 
       : 197 == a || 229 == a 
        ? c &= 5 
        : 192 <= a && 687 >= a 
         ? a = 192 
         : 1536 <= a 
          ? a = 1536 
          : 912 <= a 
           ? a = 912 
           : 160 <= a 
            ? a = 160 
            : 127 <= a 
             ? c &= 5 
             : 33 <= a 
              ? a = 59 
              : c &= 5 
      : 48 > a 
       ? c &= 5 
       : 65 > a 
        ? a = 59 
        : 96 > a 
         ? c &= 5 
         : 112 > a 
          ? a = 96 
          : 187 > a 
           ? c &= 5 
           : a = 59 

Попытка переписать его, если-то фьюжн даст следующий результат:

if (63 <= a && 77 >= a){ 
    a = 65 
} else if (48 <= a && 57 >= a){ 
    a = 48 
} else if (c & 1){ 
    if (97 <= a && 122 >= a){ 
     a = 65 
    } else if (197 == a || 229 == a){ 
     c &= 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 = 160 
    } else if (127 <= a){ 
     c &= 5 
    } else if (33 <= a){ 
     a = 59 
    } else { 
     c &= 5 
    }    
} else { 
    if (48 > a){ 
     c &= 5 
    } else if (65 > a){ 
     a = 59 
    } else if (96 > a){ 
     c &= 5 
    } else if (112 > a){ 
     a = 96 
    } else if (187 > a){ 
     c &= 5 
    } else { 
     a = 59 
    } 
} 

обратите внимание на то, что в противном случае в настоящее время отсутствует возвращаемое значение, тогда как тернарный оператор возвращает значение последнего выполняемого оператора (это может повлиять на общее значение логического выражения в круглых скобках).

+0

спасибо! Да, я просто пытался понять начало, но теперь гораздо легче понять, спасибо! – user1002194

1

Запятая не является тернарным оператором, она позволяет заменить два выражения.

Но что более важно, это беспорядок. Разбейте его, отформатируйте и прокомментируйте. Если вы не играете в гольф, объединение всего этого в одну кучу просто оскорбительно.

2

Я предпочитаю формат вложенных тройных заявлений like this, поэтому они имеют простую, читаемую структуру:

// (is this true) ? then do this 
// (is this true) ? then do this 
// (all else fails) : then do this 

Следуя эту структуру, это будет выглядеть примерно так:

63 <= a && 77 >= a ? a = 65 
: 48 <= a && 57 >= a ? a = 48 
:    c & 1 ? /* then go into this indented block below */ 
         97 <= a && 122 >= a ? a = 65 
:      197 == a || 229 == a ? c &= 5 
:      192 <= a && 687 >= a ? a = 192 
:         1536 <= a ? a = 1536 
:         912 <= a ? a = 912 
:         160 <= a ? a = 160 
:         127 <= a ? c &= 5 
:         33 <= a ? a = 59 
            /* else */ : c &= 5 
:   48 > a ? c &= 5 
:   65 > a ? a = 59 
:   96 > a ? c &= 5 
:   112 > a ? a = 96 
:   187 > a ? c &= 5 
    /* final else */ : a = 59 
+0

приятно, спасибо человеку! – user1002194

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