Soy consciente de que la longitud máxima de una matriz de JavaScript es 2 ^ 32-1, pero independientemente de la cantidad de memoria que permita, seguirá sin poder asignarse. ¿Qué está sucediendo? Reproducción de una línea:
node --max-old-space-size=100000 -e "console.log(v8.getHeapStatistics().total_available_size);Array.from({ length: Math.pow(2, 32)-1 })" Para mayor claridad, el ejemplo anterior expone 100 GB a v8, que se confirma a través total_available_size . 8 GB pueden ser suficientes para probar esta operación, ya que la mayoría de las personas no tendrán 100 GB, pero fallará de todos modos. ¿Es esto un error en V8?
(Desarrollador V8 aquí.)
No, no es un error, solo un límite definido por la implementación. V8 tiene un límite interno de ~1 GB para cualquier objeto de montón individual. A 4 bytes (con compresión de puntero) por elemento, eso significa un máximo de ~256 millones de elementos por matriz.
Hay muchos otros límites definidos por la implementación, por ejemplo, para la longitud de TypedArray, la longitud de la cadena, el tamaño de BigInt, la profundidad de recursión, la cantidad de parámetros por función, la cantidad de entradas en un mapa, etc. Prácticamente todo tiene un límite, incluso si JavaScript spec no lo menciona explícitamente, o menciona un límite teórico que es diferente de los límites de implementación (que implícitamente se supone que existen).