¿Cómo se implementan las matrices de JavaScript internamente?

Como era de esperar, las matrices Javascript son casos especiales de objetos. Por eso observas esto

  typeof ([]) == "objeto"

Aunque conceptualmente una matriz también es un objeto, existen grandes diferencias entre las implementaciones de objetos y matrices, como se puede observar en los puntos de referencia de rendimiento del mundo real.

[código]
var matriz = [];
para ( var i = 0; i & lt; 100000; i ++)
{
matriz [i] = i;
};

var obj = {};
para ( var i = 0; i & lt; 100000; i ++)
{
obj [i] = i;
};
[/código]

El bucle de matriz puede ser más de 100 veces más rápido que el bucle de objeto

Los detalles específicos variarán de un navegador a otro, pero el principio general de implementación es el mismo.

Características de una matriz de Javascript

  1. Dinámico : las matrices en Javascript pueden crecer dinámicamente .push
  2. Puede ser disperso : por ejemplo, array[50000] = 2;
  3. Puede ser denso : por ejemplo, array = [1, 2, 3, 4, 5]

En Javascript, es difícil para el tiempo de ejecución saber si la matriz será densa o dispersa. Entonces, todo lo que puede hacer es adivinar. Todas las implementaciones usan una heurística para determinar si la matriz es densa o escasa. Por ejemplo, el código en el punto 2 anterior puede indicar al tiempo de ejecución de JavaScript que es probable que sea una implementación de matriz dispersa. Si la matriz se inicializa con un recuento inicial, esto podría indicar que es probable que sea una matriz densa.

Implementación de matriz dinámica y densa:

Las matrices Javascript son dinámicas. Por lo tanto, cualquier implementación debe tener en cuenta la longitud variable de la matriz.

  1. La matriz de Javascript envuelve una matriz C simple asignada con un número fijo de elementos. (una matriz plana)
  2. Los elementos en la matriz C se redimensionan cada vez que se requiere acceso a una ubicación más allá de la longitud máxima actual. Por lo tanto, la inserción podría ser costosa.

[código]
if ((índice 1) > tamaño) {
cambiar el tamaño (índice + 1);
}
[/código]

Implementación de matriz dinámica y dispersa:

Cuando el tiempo de ejecución detecta que la matriz es dispersa, se implementa de manera similar a un objeto. Entonces, en lugar de mantener una matriz contigua, se construye un mapa clave / valor. En el caso de una matriz ya que los índices son enteros, este mapa se puede implementar de manera eficiente utilizando un Árbol de búsqueda binaria equilibrado o una estructura similar. Es probable que el rendimiento de una matriz dispersa sea similar al rendimiento de un objeto.

Las matrices se inicializan con matrices planas y luego se reemplazan con un mapa de matriz dispersa si es necesario.

Incluso con las ideas generales anteriores, todavía hay mucho margen para que los navegadores modifiquen sus implementaciones: la heurística para decidir si la matriz es escasa / densa, se utilizan estructuras de datos internas, etc.

Sin embargo, las lecciones clave para comprender estas diferencias son:

1. Nunca use un objeto, cuando necesite una matriz
2. Nunca inicialice las matrices hacia atrás (esto forzará a crear una matriz dispersa que sea menos eficiente que las matrices densas)

Esta teoría se puede verificar a través de puntos de referencia de rendimiento del mundo real, como
Rarezas de rendimiento de matriz de JavaScript (características)