2012-08-23 21 views
8

Wiem, że tablica w JavaScript to nic innego jak obiekt. Kiedy zdefiniować tablicę tak:Jak skopiować zachowanie tablicy?

var array; 
array = [ "a", "b", "c" ]; 

i uruchomić

Object.keys(array); 

dostaję po tablicy: ["0", "1", "2"]. Długość tablicy array to 3.

Kiedy dodać obiekt jak:

array["a"] = "d"; 

Object.keys() wraca ["0", "1", "2", "a"], lecz długość tablicy array wciąż 3.

Ale kiedy dodać obiekt tak:

array["3"] = "d"; 

długość array jest teraz 4.

Jeśli array jest tylko kolejnym obiektem, w jaki sposób mogę uzyskać takie zachowanie, gdy uruchamiam obiekt od podstaw, np. var myArray = {}?

+6

[Przeczytaj ten klasyczny post na blogu od Kangaxa] (http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/) - okazuje się, że nie mogę zrobić tego, o co prosisz. – Pointy

+0

możliwy duplikat [długość tablicy JavaScript niepoprawny w tablicy obiektów] (http://stackoverflow.com/questions/2528680/javascript-array-length-incorrect-on-array-of-objects) – epascarello

Odpowiedz

1

Właściwość .length obejmuje tylko właściwości z indeksami numerycznymi, szczególnie te z wartościami całkowitymi większymi lub równymi zeru.

Jeśli pytasz jak uzyskać całkowitą liczbę wszystkich kluczy z tablicy lub obiektu, a następnie można zrobić:

Object.keys(array).length 

... od Object.keys() zwraca tablicę, która będzie się mieć właściwość .length.

+0

P.S. Zauważ, że '.length' może w rzeczywistości być _greater_ niż' Object.keys (array) .length' ponieważ (jak zauważył Clyde) długość jest o jeden większy od najwyższego indeksu, ale JS pozwala na rzadkie tablice i 'Object.keys() 'zwraca tylko indeksy, które zostały faktycznie przypisane. – nnnnnn

+0

Zgaduję więc, że wartość 'length' jest obliczana za każdym razem, gdy nowa właściwość zostanie dodana do obiektu? – Amberlamps

1

Właściwość tablicy length jest wartością najwyższą indeksem liczbowym + 1.

Więc po array["3"] = "d"; najwyższy wskaźnik numeryczny jest 3 stąd długość zwraca 4

Object.keys(array).length powinno dać długości.

+0

'tablica [1000000000] =" x "' nie działa w ten sposób. Gdzie jest limit? – Amberlamps

+0

Wypróbuj 'tablicę var; array = ["a", "b", "c"]; array [1000000000] = 1; tablica.length; ' –

+0

Dodaj kolejne' 0' do indeksu i spróbuj ponownie. – Amberlamps