La diferencia entre un javascript Array
y Object
no es muy grande. De hecho, parece Array
añade principalmente el campo length
, por lo que se puede utilizar tanto Array
s y Object
s como matrices numéricas:¿Las matrices de JavaScript realmente se implementan como matrices?
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.
Así que mis preguntas es, en los motores de Javascript populares (V8, JavaScriptCore, SpiderMonkey, etc.), ¿cómo se maneja esto? ¡Obviamente no queremos que nuestras matrices se almacenen realmente como mapas hash con valores clave! ¿Cómo podemos estar razonablemente seguros de que nuestros datos se almacenan como una matriz real?
Por lo que yo puedo ver, hay algunos enfoques motores podría tomar:
Array
se implementa exactamente de la misma manera queObject
- como una matriz asociativa con claves de cadena.Array
es un caso especial, con una gama -comostd::vector
copias de las teclas numéricas, y algunos heurística densidad para evitar el uso de memoria loco si lo hacear[100000000] = 0;
Array
es lo mismo queObject
, y todos caen objetos en una heurística de ver si usar una matriz tendría más sentido.- Algo increíblemente complicado en el que no había pensado.
Realmente esto sería más sencillo si hubiera un tipo de matriz adecuada (tos WebGL matrices mecanografiadas la tos).
Este [artículo] (http://news.qooxdoo.org/javascript-array-performance-oddities-characteristics) es un poco antiguo, y no explica explícitamente la implementación. Sin embargo, realiza mediciones de rendimiento detalladas e infiere las implementaciones probables. –
La matriz no es _sólo_ un mapa con una propiedad 'length' añadida. Si lo fuera, entonces cambiar o no cambiar rompería la indexación (es decircambiar un valor de una matriz, y todavía comienza en el índice 0, no 1). Así que hay al menos un poco más pasando. (No es que esto necesariamente diga nada sobre la implementación, por supuesto) – Flambino
¿Por qué esperaría 'r [0] == ob [0] == ar [" 0 "] == ob [" 0 "] == ar. bar == ob.bar' para ser cierto? ''a '==' a '==' a'' es falso porque evalúa' verdadero == 'a'' que evalúa 'falso'. –