2011-08-15 16 views
13

Soy nuevo en Javascript, y noto que no necesita especificar el tamaño de una matriz y, a menudo, ve personas creando dinámicamente matrices de un elemento a la vez. Este sería un gran problema de rendimiento en otros idiomas, ya que necesitaría reasignar memoria para la matriz a medida que aumenta de tamaño.¿Las matrices de JavaScript en realidad están vinculadas?

¿Esto no es un problema en JavaScript? Si es así, ¿hay una estructura de listas disponible?

+0

En idiomas con matrices de tamaño variable, la memoria real asignada normalmente se duplica cada vez que tiene que crecer. Como resultado, no vas a reasignar constantemente la memoria en ningún idioma. –

+0

Gracias chicos, eso funciona bien para mí. Solo quería asegurarme de que no estaba cometiendo un error de javascript. –

Respuesta

4

En realidad, son más como objetos personalizados que usan las propiedades como índices. Ejemplo:

var a = { "1": 1, "2": 2}; 
a.length = 2; 
for(var i=0;i<a.length;i++) 
    console.log(a[i]); 

a se comportará casi como una matriz, y también se puede llamar a las funciones de la Array.prototype en él.

+0

¿No te pierdes el índice cero? – Zlatko

+0

No sé lo que @Eliu está tratando de mostrar. El código nunca funcionará de esta manera (¿tal vez la intención?). Las claves de cadena deben referenciarse como cadenas, no como números enteros. Así que incluso '' 'a [1]' '' no dará como resultado un valor. El código apropiado para enumerar los artículos sería usar '' 'for .. in''' o usar, por ejemplo, '' 'console.log (a ['' + (i + 1)]);' '' –

3

Las matrices de JavaScript no son verdaderas matrices como en C/C++ u otros idiomas. Por lo tanto, no son tan eficientes, pero son discutiblemente más fáciles de usar y no arrojan excepciones fuera de los límites.

7

Lo bueno de los lenguajes dinámicos es, bueno, que son dinámicos. Al igual que ArrayList en Java, o arrays en Perl, PHP y Python, una matriz en JavaScript asignará una cierta cantidad de memoria y cuando llegue a ser demasiado grande, el idioma se agregará automáticamente al objeto. ¿Es tan eficiente como C++ o incluso Java? No (C++ puede correr círculos incluso con las mejores implementaciones de JS), pero las personas no están construyendo Quake en JS (todavía).

En realidad, es mejor pensar en ellos como HashMaps con algunos métodos especializados también de todos modos, después de todo, esto es válido: var a = []; a['cat']='meow';.

+0

Puede depender de su definición de "válido". Sin duda se ejecutará en todas las versiones compatibles de Javascript, es eficiente y portátil y todas esas otras buenas cosas de CS. Sin embargo, es un plan realmente malo. – Malvolio

+7

Y, la gente ha creado terremoto en JS y webGL: P – fabspro

+3

http://code.google.com/p/quake2-gwt-port/ – fabspro

10

Las matrices de JavaScript se implementan típicamente como hashmaps (como los objetos Javascript) con una característica adicional: hay un atributo length, que es uno más alto que el entero positivo más alto que se ha utilizado como clave. Nada lo detiene desde también usando cadenas, números de coma flotante, incluso números negativos como claves. Nada excepto buen sentido.

+0

Tuve un momento keanu leyendo esto. Gracias – spencercooly

4

Lo matrices de JavaScript son y no se está determinada por la especificación del lenguaje concretamente en la sección 15.4. Array se define en términos de las operaciones que proporciona, no los detalles de implementación del diseño de memoria de cualquier estructura de datos particular.

¿Se podría implementar Array en la parte superior de una lista vinculada? Sí. Esto puede hacer que ciertas operaciones sean más rápidas, como shift y unshift, pero también se accede con frecuencia al índice Array, que no es eficiente con las listas enlazadas.

También es posible obtener lo mejor de ambos mundos sin listas vinculadas. Las estructuras de datos de memoria contínuas, como circular queues, tienen una inserción/eliminación eficiente desde la parte frontal y un acceso aleatorio eficiente.

En la práctica, la mayoría de los intérpretes optimizan las matrices densas mediante el uso de una estructura de datos basada en una matriz redimensionable o reasignable similar a C++ vector o Java ArrayList.

Cuestiones relacionadas