2013-01-20 14 views
9

ja jechałem przez jakieś rzeczy w źródle jQuery, a konkretnie sposobu inArray i znalazłem ten wiersz kodu:Pokój trójargumentowy w JavaScript

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

co widzę jest dwóch operatorów trójskładnikowych, ale ja nie mam pomysł, jak to jest używane. Rozumiem, jak działa operator trójskładnikowy, ale nigdy wcześniej nie widziałem, żeby był tak używany. Jak działa ten fragment kodu?

+0

dokładnie, jak można się spodziewać; rozbicie go. –

+0

jak bout: i = i? ((i <0)? Math.max (0, len + i): i): 0; – thang

+6

Ludzie, którzy piszą kod w ten sposób bez nawiasów .. ugh – ThiefMaster

Odpowiedz

9

Wystarczy rozbicie go jak chcesz 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. 
} 

W rzeczywistości, że cała linia wydaje się nieefektywne mi. Osobiście bym po prostu użyć:

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

Dzięki za wyczyszczenie tego. Dlaczego robimy 'Math.max (0, len + 1)'? Rozumiem, że to jest znaleźć największą wartość, ale dlaczego tak się dzieje? – Sethen

+0

Co oznacza no-op? –

+0

Brak działania. Nic nie dzieje się z wartością. – Sethen

4

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

rozkłada się do:

var i; 

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

przypadkiem jest "i" wskaźnik do tablicy i "len" długość tablica?

Jeśli tak jest, to, że linia będzie wykonać następujące czynności:

  • jeśli mogę być utożsamiane false, wówczas zakładamy, że to 0

  • else if I jest dodatni lub 0, a następnie Weź to, jak jest

  • w przeciwnym wypadku, jeśli i jest ujemne, to rozważmy to jako indeks liczący od końca tablicy (tj. jeśli i == - 1, oznacza to ostatni element tablicy).

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

czyta

i = i ? (i < 0 ? Math.max(0, len + i) : i) : 0; 
Powiązane problemy