2010-01-11 29 views
9

Estoy codificando una gran cantidad de datos anuales en JavaScript, y estaba considerando agregarlo a las matrices, utilizando el año como el índice de matriz y poner los datos en la matriz. Sin embargo, Firebug parece indicar que JavaScript maneja esto rellenando dos mil entradas impares en la matriz con "indefinido". Con cientos de matrices de este tipo dando vueltas en la memoria activa, me preocupa que la sobrecarga de cientos de miles de elementos inútiles de la matriz podría comenzar a ralentizar el programa. ¿Lo hará?¿Completa JavaScript elementos de matriz vacíos?

+0

Pregunta relacionada: http://stackoverflow.com/questions/1247116/which-takes-less-memory-a-javascript-array-or-javascript-object –

Respuesta

11

Cuando se establece el valor de un índice numérico mayor que la corriente length de la matriz, la propiedad length se ve afectada.

En resumen, usted debe utilizar un Object:

var data = {}; 
data[year] = "some data"; 

// or 
var data = { 
    2009: "2009 data", 
    2010: "2010 data" 
}; 

Ahora responder a la título de la pregunta: "? ¿El JavaScript pueblan elementos de matriz vacíos"

No, como dije antes, sólo la propiedad length se cambia (si es necesario, solo si el índice agregado es mayor que el length actual), length se incrementa para que sea uno más que el valor numérico de ese índice.

Los métodos Array.prototype funcionan suponiendo que el objeto de matriz tendrá sus índices comenzando desde cero.

Los índices anteriores no existen realmente en el objeto Array, puede probar que:

var array = []; 
array[10] = undefined; 

array.hasOwnProperty(10); // true 
array.hasOwnProperty(9); // false 

En conclusión, las matrices están destinados a contener índices secuenciales, a partir de cero, si sus propiedades no lo hacen cumple con esos requisitos, simplemente debes usar un objeto.

+1

Gracias - esto realmente ayudó a aclarar cómo funcionan las matrices. Cambié a los literales de objeto. – futuraprime

4

Sí, muy probablemente. Usted debe considerar el uso de un objeto de JavaScript en su lugar:

var years = {2009: 'Good', 2010: 'Better'}; 
+2

¿Por qué usar cadenas durante años? –

+0

@apphacker: Tienes razón, lo he cambiado. –

+2

No importa, como claves son equivalentes. Es solo una cuestión de gusto. –

0

Bueno, si itera sobre muchos miles de indefinidos, afectará la velocidad general del programa, aunque no está seguro si lo notará.

+1

Usted * podría *: 1024 nodos vacíos tarda aproximadamente 2ms en FF 3.5.6 –

0

Por otro lado, a veces una matriz dispersa es más fácil de usar que un objeto personalizado, y las matrices tienen estos prácticos métodos disponibles.

En una aplicación de calendario comienzo con objetos para cada año en uso, pero cada año consta de doce miembros (matriz de meses) y cada 'mes' es una matriz dispersa de fechas significativas, cuya longitud depende de la fecha más alta de ese mes que tiene datos.

Cuestiones relacionadas