Messaggio
RangeError: invalid array length (Firefox) RangeError: Invalid array length (Chrome) RangeError: Invalid array buffer length (Chrome)
Tipo di errore
Cosa è andato storto?
Un invalid array length può comparire in queste situazioni:
- Quando viene creato un
Array
o unArrayBuffer
che ha lunghezza negativa o maggiore uguale a 232, oppure - quando viene impostata la proprietà
Array.length
a un valore che è negativo o maggiore uguale a 232.
Perché la lunghezza di Array
e ArrayBuffer
è limitata? La proprietà length
di un Array
o di un ArrayBuffer
è rappresentata da un intero di 32-bit senza segno, che quindi permette di memorizzare valori nell'intervallo da 0 a 232 - 1.
Se stai creando un Array
utilizzando il costruttore, potresti invece utilizzare la notazione letterale dove il primo argomento è interpretato come la lunghezza dell' Array
.
Altrimenti, potresti voler bloccare la lunghezza prima di settare la proprietà length, o utilizzarla come argomento del costruttore.
Esempi
Casi non validi
new Array(Math.pow(2, 40))
new Array(-1)
new ArrayBuffer(Math.pow(2, 32))
new ArrayBuffer(-1)
let a = [];
a.length = a.length - 1; // setta -1 alla proprietà length
let b = new Array(Math.pow(2, 32) - 1);
b.length = b.length + 1; // setta 2^32 alla proprietà length
Casi validi
[ Math.pow(2, 40) ] // [ 1099511627776 ]
[ -1 ] // [ -1 ]
new ArrayBuffer(Math.pow(2, 32) - 1)
new ArrayBuffer(0)
let a = [];
a.length = Math.max(0, a.length - 1);
let b = new Array(Math.pow(2, 32) - 1);
b.length = Math.min(0xffffffff, b.length + 1);
// 0xffffffff è la notazione esadecimale di 2^32 - 1
// che può essere riscritta come (-1 >>> 0)