2012-01-18 168 views
3

我正在學習三元運算符。我瞭解了基礎知識,但後來我看到了這個片段,這對我沒有任何意義。任何人都可以請解釋它是如何放在一起的?!JS三元運算符混淆

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,另一位操作,但到底是什麼逗號意思?!

再就是 =一個& & 77> =一個A = 65:48

其轉換爲

如果(A> = 63 & &一個< = 77){ 一個= 65 }否則{ a = 48; }

然後附帶後< =一個& & 57> =一個? a = 48:c & 1? 97 < = a對我來說根本沒有任何意義。因爲48是針對之前的發言。有人

+0

人,這是一個很長操作。頭痛只是看着它。我可以幫助你的是[逗號運算符](https://developer.mozilla.org/en/JavaScript/Reference/Operators/Comma_Operator)。 – 2012-01-18 20:13:10

回答

7

逗號,是在JavaScript中一個獨立的operator

逗號運算符它的兩個操作數(從左至右) 並返回第二個操作數的值。

你已經掌握了只是一個表達的一部分:

然後有63 < =一個& & 77> =一個? 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 FASION將產生以下結果:

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方法當前缺少返回值,而三元運算符確實返回最後一個運算符的值(這可能會影響整體值圓括號中的布爾表達式)。

+0

非常感謝!是的,我只是想了解一開始,但現在它更容易理解,謝謝! – user1002194 2012-01-18 20:40:46

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 2012-01-18 21:15:46