2010-05-29 7 views
5

Używam Google Chrome do tego testu: W przeciwieństwie do intuicji, pierwsza pętla alarmuje "ciąg" 3 razy, podczas gdy druga pętla alarmuje "liczbę" 3 razy.Podczas iteracji wartości, dlaczego typeof (wartość) zwraca "ciąg", gdy wartość jest liczbą? JavaScript

numarray = [1, 2, 3]; 

//for-each loop 
for(num in numarray) 
    alert(typeof(num)); 

//standard loop 
for(i=0; i<numarray.length; i++) 
    alert(typeof(numarray[i])); 

Spodziewałem się, że obie pętle ostrzeżą "numer" 3 razy. W jaki sposób pierwsza pętla jest zaimplementowana w JavaScript? Innymi słowy, jeśli każdy z nich jest cukrem syntaktycznym, jaki jest jego odpowiednik przy użyciu standardowej pętli?

Czy istnieje również sposób na iterację przestrzeni nazw obiektu za pomocą standardowej pętli? Chciałbym dotknąć każdego z metod i atrybutów obiektu za pomocą pętli drugiego rodzaju. Jestem nowy w JavaScript i każda pomoc jest bardzo ceniona, dzięki.

+0

To również ostrzeże "ciąg" w IE. – Senthil

+0

możliwy duplikat [Czy indeks tablicy JavaScript jest łańcuchem lub liczbą całkowitą?] (Http://stackoverflow.com/q/27537677/1048572) – Bergi

Odpowiedz

6

Powodem widzisz „ciąg” zwrócony w swojej pierwszej pętli jest to, że num odnosi się do indeksu tablicy, nie wartość numarray w tym indeksie. Spróbuj zmienić pierwszą pętlę, aby ostrzec num zamiast typeof num, a zobaczysz, że wypluwa 0, 1 i 2, które są wskaźnikami, a nie wartościami twojej tablicy.

Podczas korzystania z pętli for in następuje iteracja właściwości obiektu, który nie jest dokładnie równoważny pętli for w drugim przykładzie. Tablice w JavaScript są w rzeczywistości obiektami z numerami sekwencyjnymi jako nazwami właściwości. Są traktowane jako łańcuchy aż do typeof.

Edit:

Jak Matthew zaznacza, nie masz gwarancję, aby uzyskać elementy w tablicy w określonej kolejności przy użyciu for in pętlę, a częściowo z tego powodu, że nie jest to zalecane do iteracji przez tablice w ten sposób.

filip-fku pyta, kiedy byłoby użyteczne użycie for in, biorąc pod uwagę to zachowanie. Jednym z przykładów jest, gdy nazwy właściwości mają znaczenie, co nie ma znaczenia w przypadku wskaźników tablicy. Na przykład:

var myName = { 
    first: 'Jimmy', 
    last: 'Cuadra' 
}; 

for (var prop in myName) { 
    console.log(prop + ': ' + myName[prop]); 
} 

// prints: 
// first: Jimmy 
// last: Cuadra 

Warto również zauważyć, że for in pętle będą również iterację właściwości łańcucha prototypów obiektu. Z tego powodu, to zwykle, jak tylko chcesz skonstruować for in pętlę:

for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
    // do something 
    } 
} 

to robi sprawdzić, czy nieruchomość została zdefiniowana przez samego obiektu, a nie przedmiotem to dziedziczy z pośrednictwem prototypu łańcuch.

+2

Nie ma gwarancji, że elementy tablicy zostaną odwiedzone w kolejności. Zobacz [dla ... w] (https://developer.mozilla.org/en/core_javascript_1.5_reference/Statements/for...in) na MDC: "iteracja po tablicy może nie odwiedzać elementów w porządku numerycznym". Jest to główny powód, dla którego ..w zazwyczaj nie jest zalecany do tablic. –

+0

+1 @ Jimmy: Dzięki za wyjaśnienie. – Senthil

+0

Interesujące! Różni się od tego, czego można by się spodziewać po C#/Java .. Ale jak to jest lepsze niż jawne pisanie standardu dla pętli, skoro wszystko, co dostajesz, to same wskaźniki zamiast samych tablic? To znaczy. dlaczego miałbyś użyć tego, skoro i tak dostajesz indeksy? (Myślę, że widzę użycie dla tablic asocjacyjnych). –

Powiązane problemy