JS Тернарный оператор путаницы - PullRequest
3 голосов
/ 19 января 2012

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

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 || - насколько я понял, это битовые операции, затем (c | = 2, еще одна битовая операция, но что означает запятая ?!

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

, что переводится как

if (a> = 63 && a <= 77) { а = 65 } еще { а = 48; } </p>

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

Ответы [ 3 ]

7 голосов
/ 19 января 2012

Запятая - это отдельный оператор в javascript:

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

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

Тогда есть 63 <= a && 77> = a?a = 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-else даст следующий результат:

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
    }
}

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

2 голосов
/ 19 января 2012

Я предпочитаю форматировать вложенные троичные операторы следующим образом , чтобы они имели простую читаемую структуру:

//   (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
1 голос
/ 19 января 2012

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

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

...