2011-12-25 13 views
30

Dlaczego przy użyciu ciągów jako kluczy tablicy, konsola pokazuje tę tablicę bez tych deklarowanych wartości i podczas iteracji przez te wartości, gdy klucze są ciągami nie są wyświetlane? , chociaż mogę uzyskać ich wartość.Ciągi znaków jako klucze tablicy w javascript

>> var arr = [ 0, 1, 2, 3 ]; 
    undefined 

>> arr["something"] = "aught"; 
    "aught" 

>> arr 
    [0, 1, 2, 3] 

>> arr["something"] 
    "aught" 

>> for(var i = arr.length; i--; console.log(arr[ i ])); 
    3 
    2 
    1 
    0 

Rozumiem, że tablice są obiektami, które zaimplementowały pewien rodzaj interfejsu "wyliczeniowego" w silniku javascript. Najbardziej interesujące jest to, że interpreter nie rzuca ani ostrzeżenia, ani błędu, więc spędziłem kilka czasu na szukaniu miejsca, w którym dane mogłyby zostać utracone. teraz, że niesłusznie i stosowane [] zamiast {}

Odpowiedz

69

w JavaScript są dwa typu tablicach: standardowych tablic i asocjacyjnych

  • [ ] - standardowe Array - 0 na podstawie indeksów całkowite tylko
  • { } - asocjacyjna - obiekty javascript, gdzie klucze mogą być dowolne ciągi

Więc podczas definiowania:

var arr = [ 0, 1, 2, 3 ]; 

definiujesz standardową tablicę, w której indeksy mogą być tylko liczbami całkowitymi. Kiedy wykonujesz arr["something"] od something (który jest tym, czego używasz jako indeks) nie jest liczbą całkowitą, w zasadzie definiujesz właściwość do obiektu arr (wszystko jest obiektem w javascript). Ale nie dodajesz elementu do standardowej tablicy.

+2

@abuduba, ponieważ nie ma w tym nic złego :-) Twój kod jest całkowicie poprawny javascript. Jest niejednoznaczne dla czytelnika, ponieważ miksujesz dwa rodzaje tablic, ale jest on ważny. Dlaczego chcesz, aby tłumacz powiedział, że coś jest nie tak, kiedy nie ma nic złego. –

+18

Jest to głównie problem z terminologią, ale javascript NIE na ogół nazywa się '{}' tablicą asocjacyjną. Nazywają to obiektem, który ma właściwości. Czy większość ludzi nie jest zgodna co do tego, że nie należy mylić rzeczy, nazywając obiekt javascript tablicą asocjacyjną? – jfriend00

+1

Uwaga: Jeśli spróbujesz użyć '' defineProperty'' na tablicy takiej jak '' Object.defineProperty.call (arr, 'something', 'ilght'); '' spowoduje to błąd. – David

9

for(var i = arr.length; i--; console.log(arr[ i ]));

To tylko daje wskaźników liczbowych, oczywiście, ale nadal można pętli nad obu wskaźników liczbowych i kluczy smyczkowych macierzy tak:

for (var x in arr) { 
    console.log(x + ": " + arr[x]); 
} 
/* (console output): 
    0: 0 
    1: 1 
    2: 2 
    3: 3 
    something: aught 
*/ 
+1

, więc dodajmy to 'Array.prototype.somethingCool =" niezupełnie ";', a następnie uruchom twoją pętlę for-in-loop !! – KhaledMohamedP

Powiązane problemy