W ten sposób JSfromhell definiuje funkcję, aby znaleźć sumę tablicy numerycznej (http://jsfromhell.com/array/sum)

sum = function(o){
    for(var s = 0, i = o.length; i; s += o[--i]);
    return s;
};
//sum([1, 2, 3, 4, 5, 6, 7, 8, 9])

Czy ktoś może wyjaśnić, co dzieje się w drugiej części pętli? Jakie jest znaczenie "ja;"? Wygląda na to samo jak ja> = 0. Ale to zwraca NAN.

2
Subbu 14 grudzień 2011, 17:18

5 odpowiedzi

Najlepsza odpowiedź

JavaScript ma różne sposoby wymuszenia wartości nie-boolowskich do true lub false. Jeden z nich ma zrobić z liczbami: zero to false, dowolny inny numer to true.

W przypadku ciągów pusty ciąg to false, inni są true. Wartość {{x2}

Możesz pisać ten kod:

for (var s = 0, i = o.length; i > 0; s += o[--i]);

I może być jeszcze bardziej wydajny. (Albo może nie być; jest to rodzaj mikrooptymalizacji, o której powinni się martwić, ponieważ w przyszłym tygodniu dostawcy przeglądarki mogą przeglądać swoje tłumaczy i odwrócić sytuację na głowie).

Wreszcie, jeśli otrzymasz NaN, oznacza to, że tak naprawdę nie masz tablicy liczb. Jeśli w tablicy znajduje się pojedyncza rzecz, która nie może być przeliczona na wartość liczbową w trzeciej części pętli "dla", otrzymasz wynik NaN. edytuj - och, czekaj, widzę; Próbowałeś i >= 0 i nie i > 0. Oznacza to, że pętla spróbuje uzyskać dostęp o[-1], który jest niezdefiniowany. To daje ci NaN, gdy próbujesz przekonwertować go na numer.

3
Pointy 14 grudzień 2011, 13:25

Pętla jako całość:

for(var s = 0, i = o.length; i; s += o[--i]); 

Inicjalizacja pętli (faktycznie tworzy dwie zmienne):

 var s = 0          // set sum = 0
 var i = o.length   // set "current item index" equal to last index in array

Warunek testu pętli (gdy staje się fałszywe, pętla kończy się)

 i  // so this will become false when i == 0

Odliczanie wyrażenia:

 s += o[--i]

Dodaje to wartość "bieżącej" elementu array do sumy i zmniejsza indeks pętli, aby zmienić "prąd" element tablicy. Bardzo ważne , używa wstępnego zmniejszenia, aby:

  • Nie ma dostępu bez wartości granicznej (gdy {X0}}, o[i] byłoby poza granicami, podczas gdy ostatni element będzie dostępny przez o[i-1])
  • faktycznie przetwarza element w o[0] (sposób, w jaki test pętli jest zapisany, gdy i == 0 pętla zostanie wyjmij natychmiast, aby o[0] rzeczywiście musi zostać przetworzona, gdy i == 1)
3
Jon 14 grudzień 2011, 13:25

FHE For-Loop Stan sprawdza, czy i jest nieprawidłowy eliksja IR. Jego efekt jest równoważny z robieniem i !== 0

0
hugomg 14 grudzień 2011, 13:24

Najpierw określa, że s jest 0 i {x1}} jest długością tablicy

var s = 0, i = o.length;

Następnie przekazuje i jako warunkowa, gdy JS Parse format numeru do Boolean, zobaczysz, że 0 or less jest false i 1 or more.

i; //is true until it became 0
0
Gabriel Gartz 14 grudzień 2011, 13:24
sum = function(o){
    for(var s = 0, i = o.length; i; s += o[--i]);
    return s;
};
//sum([1, 2, 3, 4, 5, 6, 7, 8, 9])

Pierwsza część (Deklaracja): s = 0 i i = długość tablicy o

2 część (stan) i odzwierciedla wskaźnik tablicy, który zaczynamy od długości tablicy o. Jeśli nasz indeks stanie się 0, będzie równoważny false.

3 część (akcja) s jest zwiększany przez liczbę całkowitą w pozycji --i tablicy o. -- jest operatorem deincrema, który jest równoważny i = i-1. Pozycja tego operatora jest ważna. Ponieważ jest przed literą i, odwrócenia programu i przed jej odtworza. Więc po raz pierwszy tam dotrze, i jest już o.length - 1.

0
Vigrond 14 grudzień 2011, 13:30