2011-07-09 14 views
5

Mam tu na myśli wywołanie .push() na obiekcie Array, a JavaScript zwiększa pojemność (w liczbie elementów) podstawowej "tablicy". Ponadto, jeśli istnieje dobry zasób do znajdowania tego rodzaju informacji dla JS, byłoby to pomocne.W jaki sposób nowoczesne przeglądarki implementują JS Array, specjalnie dodając elementy?

edit

Wydaje się, że Array JS jest jak przedmiot dosłownym o specjalnych właściwościach. Jednak interesuje mnie niższy poziom szczegółowości - jak przeglądarki wykorzystują to w swoich silnikach JS.

+0

co masz na myśli przez pojemność? rozmiar w bajtach? – Ibu

+1

Wyobrażam sobie, że to zależy od implementacji. Nie sądzę, że jest określone, że musi to być wykonane w określony sposób ... – jswolf19

+0

@ jswolf19 W pewnym sensie założyłem, że nikt taki jak w3c lub Ecma nie określił implementacji, ale na pewno istnieją implementacje, np. dla webkita. – Jeff

Odpowiedz

4

Nie może być dowolny jedna poprawna odpowiedź na ten qurstion. Mechanizm rozwijania macierzy to wewnętrzny szczegół implementacji i może się różnić w zależności od implementacji JS. W rzeczywistości silnik Tamarin ma dwie różne implementacje używane wewnętrznie dla tablic zależnie od tego, czy ustala, czy tablica będzie sekwencyjna czy rzadka.

+0

+1, dałbym Wam więcej, gdybym mógł, nieczęsto dowiedziałbym się czegoś nowego o JS :) Najwyraźniej zarówno Chrome i FF używają podobnych implementacji (zarówno wektorów i hashów lub podobnych), jak można wywnioskować z benchmarków: http://jsperf.com/array-popuplation-direction –

+0

@Samuel Neff To jest naprawdę interesujące. Jak dowiesz się, jak różne przeglądarki (odpowiednie silniki JS) pracują na tym poziomie? – Jeff

+0

Interesujący artykuł na ten temat: http://news.qooxdoo.org/javascript-array-performance-oddities-charakterystyka –

0

Javascript robi zawierać mechanizm zadeklarować długość tablicy jak:

var foo = new Array(3); 
alert(foo.length); // alerts 3 

Ale ponieważ tablice są dynamiczne w JavaScript nie ma powodu, aby to zrobić, nie trzeba ręcznie przydzielić tablice . Powyższy przykład nie tworzy tablicy o stałej długości, tylko inicjuje ją 3 niezdefiniowanymi elementami.

// Edit: I albo misread pytanie czy go zmienić, przykro mi, nie sądzę, że to jest to, co pan pyta.

+0

Przydatne informacje, ale nie jest prawdą, że nie ma powodu, aby to robić. Bardzo możliwe, że inicjalizacja tablicy do znanej przyszłej długości sprawi, że dodanie jej później stanie się bardziej wydajne. Całkowicie zależy to od implementacji poszczególnych przeglądarek, ale może to być duża poprawa wydajności w zależności od implementacji. –

1

Ta odpowiedź jest błędna. Proszę zobaczyć odpowiedź @Samuel Neff oraz następujących zasobów:

http://news.qooxdoo.org/javascript-array-performance-oddities-characteristics

http://jsperf.com/array-popuplation-direction

Tablice w JavaScript nie ma możliwości, ponieważ nie są prawdziwymi tablicami. Są właściwie tylko sprzeciw mieszań z właściwością length i właściwości "0", "1", "2" itd Kiedy robisz .push() na tablicy, robi to skutecznie:

ary[ ary.length++ ] = the_new_element; // set via hash 

+1

Możesz pominąć '++' na 'ary.length'. – Reid

+0

@Reid - nie, nie możesz. ++ ma na celu zwiększenie array.length, nie używać podczas ustawiania wartości (miałem na myśli to, co działo się wewnątrz silnika, a nie rzeczywistego kodu JS) –

+0

@cwolves, twój opis obiektu Array w JavaScript nie jest zły w ogóle są to proste obiekty, jak mówisz, z pewnymi cechami szczególnymi - jak ich własność "length" - dziedziczą po 'Array.prototype' i ich własność' [[Class]] '' Array "', na przykład '({}). toString.call ([]); // "[object Array]" ', ale tak, wewnętrzne zarządzanie pamięcią jest całkowicie * zależne od implementacji *. – CMS

Powiązane problemy