2011-07-09 32 views
5

Con questo intendo quando si chiama .push() su un oggetto Array e JavaScript aumenta la capacità (in numero di elementi) della "matrice" sottostante. Inoltre, se esiste una buona risorsa per trovare questo tipo di informazioni per JS, sarebbe utile includerle.In che modo i browser moderni implementano JS Array, in particolare aggiungendo elementi?

modifica

Sembra che l'array JS è come un oggetto letterale con proprietà speciali. Tuttavia, mi interessa un livello di dettaglio più basso - come i browser lo implementano nei rispettivi motori JS.

+0

cosa intendi per capacità? dimensione in byte? – Ibu

+1

Immagino che dipenda dall'implementazione. Non penso che sia specificato che deve essere fatto in un certo modo ... – jswolf19

+0

@ jswolf19 Penso che nessuno come W3c o Ecma abbia specificato un'implementazione, ma sicuramente ci sono implementazioni, ad es. per webkit. – Jeff

risposta

4

Non ci può essere alcun singola risposta corretta a questa qurstion. Il meccanismo di espansione di un array è un dettaglio di implementazione interno e può variare da un'implementazione JS a un'altra. In effetti, il motore Tamarin ha due diverse implementazioni utilizzate internamente per gli array a seconda che determini se la matrice sarà sequenziale o sparsa.

+0

+1, ti darei di più se potessi non capisco spesso nulla di nuovo su JS :) Apparentemente sia Chrome che FF usano implementazioni simili (sia un vettore e un hash, o simili) come si può dedurre dai benchmark: http://jsperf.com/array-popuplation-direction –

+0

@ Samuel Neff Questo è davvero interessante. Come scopri come i diversi browser (i rispettivi motori JS) funzionano a questo livello? – Jeff

+0

Un interessante articolo su questo argomento: http://news.qooxdoo.org/javascript-array-performance-oddities-characteristics –

0

Javascript include un meccanismo per dichiarare la lunghezza della matrice come:

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

Ma dal momento array sono dinamici in javascript non c'è alcun motivo per fare questo, non c'è bisogno di assegnare manualmente gli array . L'esempio sopra non crea una matrice a lunghezza fissa, la inizializza solo con 3 elementi non definiti.

// Modifica: ho letto erroneamente la tua domanda o l'hai modificata, mi dispiace, non penso che questo sia quello che stavi chiedendo.

+0

Informazioni utili, ma non è corretto dire che non vi è alcun motivo per farlo. È molto probabile che l'inizializzazione di un array con una lunghezza futura nota aumenterà l'efficienza in seguito. Dipende interamente dall'implementazione del singolo browser, ma può essere un grande miglioramento delle prestazioni a seconda dell'implementazione. –

1

Questa risposta è sbagliata. Si prega di consultare la risposta di @Samuel Neff e le seguenti risorse:

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

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

array in JavaScript non hanno una capacità in quanto non sono array reali. Sono in realtà solo oggetto hash con una proprietà length e le proprietà di "0", "1", "2", ecc Quando si esegue .push() su un array, lo fa in modo efficace:

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

+1

Puoi lasciare fuori '++' su 'ary.length'. – Reid

+0

@Reid: no, non puoi. Il ++ sta per incrementare array.length, non usare mentre si imposta il valore (mi riferivo a cosa stava accadendo all'interno del motore, non al vero codice JS) –

+0

@cwolves, la descrizione di un oggetto Array in Javascript non è errata sono oggetti semplici come dici tu, con alcune caratteristiche speciali -come la loro proprietà 'length'-, ereditano da' Array.prototype' e la loro proprietà interna di '[[Class]]' è '' Array '', per esempio '({}) ToString.call ([]).; // "[oggetto Array]" ', ma sì, i componenti interni della gestione della memoria sono completamente * dipendenti dall'implementazione *. – CMS

Problemi correlati