2011-07-09 22 views
5

Con esto me refiero a llamar al .push() en un objeto Array y JavaScript aumenta la capacidad (en cantidad de elementos) de la "matriz" subyacente. Además, si hay un buen recurso para encontrar este tipo de información para JS, sería útil incluirlo.¿Cómo implementan los navegadores modernos JS Array, específicamente agregando elementos?

edición

Parece que la matriz de JS es como un objeto literal con propiedades especiales. Sin embargo, me interesa un nivel de detalle más bajo: cómo los navegadores implementan esto en sus respectivos motores JS.

+0

¿qué quieres decir con capacidad? tamaño en bytes? – Ibu

+1

Imagino que depende de la implementación. No creo que esté especificado que deba hacerse de cierta manera ... – jswolf19

+0

@ jswolf19 Supongo que nadie como w3c o Ecma ha especificado una implementación, pero seguramente hay implementaciones, p. para webkit. – Jeff

Respuesta

4

No puede haber ningún única respuesta correcta a esta pregunta. El mecanismo de una matriz para expandir es un detalle de implementación interna y puede variar de una implementación de JS a otra. De hecho, el motor Tamarin tiene dos implementaciones diferentes utilizadas internamente para las matrices, dependiendo de si determina si la matriz va a ser secuencial o dispersa.

+0

+1, te daría más si pudiera. A menudo no aprendo nada nuevo sobre JS :) Al parecer, Chrome y FF utilizan implementaciones similares (tanto un vector y un hash, o similar) como se puede deducir de los puntos de referencia: http://jsperf.com/array-popuplation-direction –

+0

@Samuel Neff Esto es realmente interesante. ¿Cómo se puede saber cómo funcionan los diferentes navegadores (sus respectivos motores JS) en este nivel? – Jeff

+0

Un interesante artículo sobre este tema: http://news.qooxdoo.org/javascript-array-performance-oddities-characteristics –

0

Javascript sí incluye un mecanismo para declarar la longitud de la matriz como:

var foo = new Array(3); 
alert(foo.length); // alerts 3 

Pero ya que las matrices son dinámicas en javascript no hay ninguna razón para hacer esto, usted no tiene que asignar manualmente las matrices . El ejemplo anterior no crea una matriz de longitud fija, solo la inicializa con 3 elementos indefinidos.

// Editar: He leído mal tu pregunta o la has cambiado, lo siento, pero no creo que esto sea lo que estabas preguntando.

+0

Información útil, pero no es correcto decir que no hay ninguna razón para hacer esto. Es muy posible que la inicialización de una matriz a una longitud futura conocida hará que agregar más tarde sea más eficiente. Depende completamente de la implementación del navegador individual, pero puede ser una gran mejora de rendimiento dependiendo de la implementación. –

1

Esta respuesta es incorrecta. Por favor, véase la respuesta de @Samuel Neff y los siguientes recursos:

http://news.qooxdoo.org/javascript-array-performance-oddities-characteristics

http://jsperf.com/array-popuplation-direction

Arrays en Javascript no tienen una capacidad ya que no son matrices reales. En realidad, son simplemente objeto hash con una propiedad length y propiedades de "0", "1", "2", etc. Al hacer .push() en una matriz, lo hace de manera efectiva:

ary[ ary.length++ ] = the_new_element; // set via hash 

+1

Puedes dejar el '++' en 'ary.length'. – Reid

+0

@Reid - no, no puedes. ++ es para aumentar array.length, no para usar mientras se establece el valor (me refería a lo que estaba sucediendo dentro del motor, no al código JS real) –

+0

@cwolves, su descripción de un objeto Array en Javascript no está mal en absoluto, son objetos simples como usted dice, con algunas características especiales -como su propiedad 'length'-, heredan de' Array.prototype' y su propiedad interna '[[Class]]' es '" Array "', p.ej '({}). toString.call ([]); // "[matriz de objetos]" ', pero sí, las funciones internas de la administración de memoria dependen completamente * de la implementación *. – CMS

Cuestiones relacionadas