La differenza tra uno javascript Array
e Object
non è molto grande. In realtà sembra Array
aggiunge principalmente il campo length
, in modo da poter utilizzare sia Array
s e Object
s come matrici numeriche:Gli array javascript sono effettivamente implementati come array?
var ar = new Array();
ar[0] = "foo";
ar["bar"] = "foo";
var ob = new Object();
ob[0] = "foo";
ob["bar"] = "foo";
assert(ar[0] == ob[0] == ar["0"] == ob["0"] == ar.bar == ob.bar); // Should be true.
Così le mie domande è, nei motori javascript popolari (V8, JavaScriptCore, SpiderMonkey, ecc.), come viene gestito? Ovviamente non vogliamo che i nostri array vengano effettivamente memorizzati come mappe di hash con valori chiave! Come possiamo essere ragionevolmente sicuri che i nostri dati siano archiviati come un vero array?
Per quanto posso vedere ci sono alcuni approcci motori potrebbe assumere:
Array
è implementato esattamente allo stesso modo diObject
- come un array associativo con le chiavi di stringa.Array
è un caso speciale, con una matrice -comestd::vector
sostenere i tasti numerici, e alcuni euristica densità per impedire l'uso della memoria folle se si faar[100000000] = 0;
Array
è lo stessoObject
, e tutti gli oggetti ottenere un euristico per vedere se l'utilizzo di un array avrebbe più senso.- Qualcosa follemente complicato a cui non ho pensato.
realtà questo sarebbe più semplice se ci fosse un tipo di matrice corretta (tosse WebGL array tipizzati tosse).
Questo [articolo] (http://news.qooxdoo.org/javascript-array-performance-oddities-characteristics) è un po 'vecchio e non spiega esplicitamente l'implementazione. Tuttavia, esegue misurazioni dettagliate delle prestazioni e ne deduce le probabili implementazioni. –
L'array non è _just_ una mappa con una proprietà 'length' attaccata. Se lo fosse, allora lo spostamento o il nonshifting interromperà l'indicizzazione (ad es.sposta un valore fuori da un array e inizia ancora dall'indice 0, non 1). Quindi c'è almeno un po 'di più in corso. (Non che questo dica necessariamente qualcosa sull'implementazione, ovviamente) – Flambino
Perché dovresti aspettarti 'r [0] == ob [0] == ar [" 0 "] == ob [" 0 "] == ar. bar == ob.bar' per essere vero? ''a' == 'a' == 'a'' è falso perché valuta' true ==' a'' che valuta 'false'. –