2013-01-20 46 views
9

我正在經歷的jQuery的源的一些東西,特別是inArray方法,我發現這行代碼:雙三元

i = i ? i < 0 ? Math.max(0, len + i) : i : 0; 

我所看到的是二三元的運營商,但我沒有想法如何使用它。我理解三元運算符是如何工作的,但我從來沒有見過像這樣使用過。這段代碼如何工作?

+0

正是你如何期望;分解它。 –

+0

怎麼回事:我=我? ((i <0)?Math.max(0,len + i):i):0; – thang

+6

寫這樣的代碼沒有括號的人.. ugh – ThiefMaster

回答

9

就打破它,就像您1 + 2 + 3

if (i) { 
    if (i < 0) { 
     i = Math.max(0, len + i); 
    } else { 
     i = i; // no-op 
    } 
} else { 
    i = 0; // also no-op, since if `i` were anything else it would be truthy. 
} 

事實上,整條生產線,似乎效率低下給我。個人而言,我只希望用:

if (i < 0) { 
    i = Math.max(0, len + i); 
} 
+0

感謝您解決這個問題。爲什麼我們要做'Math.max(0,len + 1)'?我意識到要找到最大的價值,但爲什麼會發生這種情況? – Sethen

+0

無操作代表什麼? –

+0

沒有操作。價值沒有任何變化。 – Sethen

4

i = i ? i < 0 ? Math.max(0, len + i) : i : 0;

分解爲:

var i; 

if(i){ 
    if(i<0){ 
    i = Math.max(0, len + i); 
    }else{ 
    i = i; 
    } 
}else{ 
    i = 0; 
} 
0

以任何機會,是 「我」 的索引到一個數組和 「LEN」 的長度數組?

如果是這樣,那麼該行會做到以下幾點:

  • ,如果我可以等同於false,那麼假定它是0

  • 否則,如果我爲正或0,則因爲它是

  • 否則,如果我是負數,那麼認爲它是一個從數組末尾算起的指數(即如果i == -1,則表示數組的最後一個元素)。

0
i = i ? i < 0 ? Math.max(0, len + i) : i : 0; 

讀取到

i = i ? (i < 0 ? Math.max(0, len + i) : i) : 0;