¿Son escasas las matrices de Javascript?
Es decir, si uso la hora actual como índice en la matriz:
array[Date.getTime()] = value;
¿El intérprete creará una instancia de todos los elementos desde 0 hasta ahora? ¿Los distintos navegadores lo hacen de forma diferente?
Recuerdo que solía haber un error en el kernel de AIX , que creaba pseudo-ttys a pedido, pero si lo hiciera, digamos, "echo > /dev/pty10000000000", crearía /dev/pty0, /dev/pty1, .... y luego caer muerto. Fue divertido en las ferias comerciales, pero no quiero que esto les pase a mis clientes.
Sí lo son. En realidad, internamente son tablas hash, por lo que puedes usar no solo números enteros grandes sino también cadenas, flotantes u otros objetos. Todas las claves se convierten en cadenas toString()
antes de agregarlas al hash. Puedes confirmar esto con algún código de prueba:
<script>
var array = [];
array[0] = "zero";
array[new Date().getTime()] = "now";
array[3.14] = "pi";
for (var i in array) {
alert("array["+i+"] = " + array[i] + ", typeof("+i+") == " + typeof(i));
}
</script>
Muestra:
array[0] = zero, typeof(0) == string
array[1254503972355] = now, typeof(1254503972355) == string
array[3.14] = pi, typeof(3.14) == string
Observe cómo utilicé for...in
la sintaxis, que solo le proporciona los índices que realmente están definidos. Si utiliza el for (var i = 0; i < array.length; ++i)
estilo de iteración más común, obviamente tendrá problemas con índices de matriz no estándar.
La forma exacta en que se implementan las matrices de JavaScript difiere de un navegador a otro, pero generalmente recurren a una implementación escasa (muy probablemente la misma que se usa para el acceso a las propiedades de objetos normales) si usar una matriz real fuera ineficiente.
Tendrá que pedirle a alguien con más conocimiento sobre implementaciones específicas que responda qué desencadena exactamente el cambio de denso a escaso, pero su ejemplo debería ser perfectamente seguro. Si desea obtener una matriz densa, debe llamar al constructor con un argumento de longitud explícito y esperar obtener uno.
Consulte esta respuesta para obtener una descripción más detallada de olliej.
Podrías evitar el problema utilizando una sintaxis de JavaScript diseñada para este tipo de cosas. Puedes tratarlo como un diccionario, pero la sintaxis "for... in..." te permitirá capturarlos todos.
var sparse = {}; // not []
sparse["whatever"] = "something";
Los objetos Javascript son escasos y las matrices son solo objetos especializados con una propiedad de longitud mantenida automáticamente (que en realidad es uno más grande que el índice más grande, no el número de elementos definidos) y algunos métodos adicionales. Estás a salvo de cualquier manera; use una matriz si necesita características adicionales y un objeto en caso contrario.