Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

324
Views
Matriz preasignada de JavaScript Uncaught RangeError: longitud de matriz no válida

Tengo un pequeño bucle de código que arroja Uncaught RangeError: Invalid Array Length

Pude reproducirlo solo con esto en la consola de Google Chrome

 const COUNT = 100_000_000; const xValues = new Array(COUNT); const yValues = new Array(COUNT); for (let i = 0; i < COUNT; i++) { xValues[i] = i; yValues[i] = Math.sin(i * 0.000001); } console.log(`count: ${yValues.length}`);

Aquí está el resultado en la consola del desarrollador

ingrese la descripción de la imagen aquí

Hasta donde yo sé, el tamaño máximo de matriz en Javascript es 2^32-1. Debe haber suficiente memoria para asignar aquí y el índice i nunca es negativo o está fuera de los límites de la matriz, por lo que puedo ver.

Curiosamente, si uso este código, no se bloquea

 const COUNT = 100_000_000; const xValues = new Array(COUNT); const yValues = new Array(COUNT); for (let i = 0; i < COUNT; i++) { xValues[i] = i; yValues[i] = i; } console.log(`count: ${yValues.length}`);

ingrese la descripción de la imagen aquí

El valor asignado a yValues[i] nunca sale del rango -1, +1, por lo que tampoco puedo ver esto como un problema de número fuera de rango.

¿Alguien arroja algo de luz sobre esto?

EDITAR: Actualizar

Otro escenario que no funciona. Cálculo de un paseo aleatorio.

 const count = 100_000_000; const xValues = new Array(COUNT); const yValues = new Array(COUNT); let prevYValue = 0; for (let i = 0; i < COUNT; i++) { const curYValue = Math.random() - .5; xValues[i] = i; yValues[i] = prevYValue + curYValue; prevYValue += curYValue; }

¡Este también tira! Pero

 yValues[i] = i

está bien ¯\_(ツ)_/¯

EDITAR: Actualización 2

Ahora puedo confirmar que esto es específico del navegador, si ejecuta la misma prueba en Firefox, funciona, pero el navegador le pide que espere.

¿Sospecha que la excepción Uncaught RangeError es un tiempo de espera mal informado?

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

La verdadera razón está en la optimización de la memoria V8. Cuando almacena números enteros, almacena el número de 32 bits en su lugar, pero cuando almacena números dobles, se almacena de manera diferente (como un objeto), por lo que la matriz yValues contiene la referencia pero el valor real almacenado en el montón. Entonces, en su ejemplo, acaba de usar toda la memoria del montón. Para ver el límite, usa: console.memory y verás algo como esto:

 MemoryInfo { totalJSHeapSize: 10000000, usedJSHeapSize: 10000000, jsHeapSizeLimit: 3760000000}

En mi navegador es 3_760_000_000

El objeto en el montón ocupa más de 50 bytes, por lo que mi límite ronda los 69_000_000 números de punto flotante.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!