2009-08-07 17 views
13

Si tengo una lista de Javascript que solo tendrá claves numéricas, ¿qué toma menos memoria?¿Qué toma menos memoria: una matriz Javascript u objeto Javascript?

var array = []; 
array[0] = 'hello'; 
array[5] = 'world'; 
array[50] = 'foobar'; 

var obj = {}; 
obj[0] = 'hello'; 
obj[5] = 'world'; 
obj[50] = 'foobar'; 

no sé un montón sobre internos del motor de Javascript, así que ...

La razón que pido es porque esa matriz, cuando se convierte en una cadena, tendrá un montón de de definir en los medio de eso. ¿Están esos realmente almacenados de alguna manera, o simplemente se pone en la conversión de cadenas?

+0

Para responder a su última pregunta ("¿Están realmente almacenados de alguna manera?"), No, no están almacenados, y sí, eso es solo parte de la conversión de cadenas. (Aunque todavía debe usar objetos en lugar de matrices para este tipo de cosas.) –

Respuesta

11

Una matriz es básicamente un conjunto ordenado de valores asociados con un único nombre de variable.

En su ejemplo, creo que intenta hacer una matriz asociativa, y debe usar object, Array no está destinado a ser utilizado para pares clave/valor.

También la longitud de la matriz se incrementa indirecly cuando se asigna un valor a un índice con una mayor longitud de la longitud de la matriz actual:

var array = new Array(); 
array[99] = "Test"; 
// array.length is now 100 

Marque esta detailed article sobre el tema.

+0

Tenga en cuenta que esto en realidad no aumenta la cantidad de memoria que ocupa la matriz (o al menos no debería, algunos navegadores podrían no manejar bien este tipo de situación). La propiedad '.length' simplemente devuelve el último índice numérico definido +1, por eso es que ve ese comportamiento. Pero estoy de acuerdo en que se debe usar un objeto por todos los motivos indicados. –

-1

Probablemente la matriz JavaScript porque 'solo' usa valores numéricos, donde los literales de los objetos proporcionan un espacio para los valores clave, e incluso si usa valores numéricos, probablemente se manejan de manera diferente que los valores numéricos para matrices.

Lo más probable es que las matrices razones no pueden tener valores de clave basados ​​en texto porque se tratan de forma diferente que los literales de objeto. Supongo que debido a que probablemente se les trate de manera diferente, el procesamiento de la matriz probablemente esté más optimizado para los valores de clave numéricos, ya que un objeto literal está optimizado para usar cadenas o números como sus claves.

+2

Las matrices PUEDEN tener "valores de clave basados ​​en texto" ... Las matrices son solo objetos (al menos en JS). – James

0

JavaScript no implementa matrices como otros lenguajes por lo que no obtiene mejoras de rendimiento inherentes a una matriz normal (en cuanto a la memoria); en JavaScript, una matriz es muy similar a un objeto; en realidad, es esencialmente un objeto solo con unos pocos métodos y capacidades adicionales (como una longitud que se actualiza a sí misma). Yo diría que ninguno es más rápido.

+3

Eso es incorrecto: todas las implementaciones de JS tienen implementaciones "eficientes" de matrices, al menos son sustancialmente más eficientes que los objetos normales. Todos suponen que una matriz compacta es la norma, y ​​una matriz dispersa es poco común y, por lo tanto, optimiza el uso de la matriz "normal". Pruebas de perforación muy simples habrían demostrado que: D – olliej

Cuestiones relacionadas