RangeError: invalid array length
Die JavaScript-Ausnahme "Ungültige Array-Länge" tritt auf, wenn eine Array-Länge angegeben wird, die entweder negativ, eine Fließkommazahl ist oder das maximal von der Plattform unterstützte Limit überschreitet (d.h. beim Erstellen eines Array oder ArrayBuffer, oder beim Setzen der length-Eigenschaft).
Die maximal zulässige Array-Länge hängt von der Plattform, dem Browser und der Browserversion ab.
Für ein Array beträgt die maximale Länge 232-1.
Für ein ArrayBuffer beträgt das Maximum 231-1 (2GiB-1) auf 32-Bit-Systemen.
Ab Firefox Version 89 ist der Maximalwert von ArrayBuffer 233 (8GiB) auf 64-Bit-Systemen.
Hinweis:
Array und ArrayBuffer sind unabhängige Datenstrukturen (die Implementierung der einen beeinflusst die andere nicht).
Nachricht
RangeError: invalid array length (V8-based & Firefox) RangeError: Array size is not a small enough positive integer. (Safari) RangeError: Invalid array buffer length (V8-based) RangeError: length too large (Safari)
Fehlerart
RangeError
Was ist schiefgelaufen?
Der Fehler kann auftreten, wenn versucht wird, ein Array oder ArrayBuffer mit einer ungültigen Länge zu erzeugen, was Folgendes einschließt:
- Negative Länge, über den Konstruktor oder das Setzen der
length-Eigenschaft. - Nicht-ganzzahlige Länge, über den Konstruktor oder das Setzen der
length-Eigenschaft. (DerArrayBuffer-Konstruktor zwingt die Länge zu einem Integer, derArray-Konstruktor hingegen nicht.) - Überschreiten der von der Plattform unterstützten maximalen Länge. Für Arrays beträgt die maximale Länge 232-1. Für
ArrayBufferbeträgt die maximale Länge 231-1 (2GiB-1) auf 32-Bit-Systemen oder 233 (8GiB) auf 64-Bit-Systemen. Dies kann über den Konstruktor, das Setzen derlength-Eigenschaft oder durch Array-Methoden, die implizit die Länge setzen (wiepushundconcat), geschehen.
Wenn Sie ein Array mit dem Konstruktor erstellen, möchten Sie wahrscheinlich stattdessen die Schreibweise mit Literalen verwenden, da das erste Argument als Länge des Array interpretiert wird. Andernfalls sollten Sie die Länge begrenzen, bevor Sie die Länge setzen oder sie als Argument des Konstruktors verwenden.
Beispiele
>Ungültige Fälle
new Array(2 ** 40);
new Array(-1);
new ArrayBuffer(2 ** 32); // 32-bit system
new ArrayBuffer(-1);
const a = [];
a.length -= 1; // set the length property to -1
const b = new Array(2 ** 32 - 1);
b.length += 1; // set the length property to 2^32
b.length = 2.5; // set the length property to a floating-point number
const c = new Array(2.5); // pass a floating-point number
// Concurrent modification that accidentally grows the array infinitely
const arr = [1, 2, 3];
for (const e of arr) {
arr.push(e * 10);
}
Gültige Fälle
[2 ** 40]; // [ 1099511627776 ]
[-1]; // [ -1 ]
new ArrayBuffer(2 ** 31 - 1);
new ArrayBuffer(2 ** 33); // 64-bit systems after Firefox 89
new ArrayBuffer(0);
const a = [];
a.length = Math.max(0, a.length - 1);
const b = new Array(2 ** 32 - 1);
b.length = Math.min(0xffffffff, b.length + 1);
// 0xffffffff is the hexadecimal notation for 2^32 - 1
// which can also be written as (-1 >>> 0)
b.length = 3;
const c = new Array(3);
// Because array methods save the length before iterating, it is safe to grow
// the array during iteration
const arr = [1, 2, 3];
arr.forEach((e) => arr.push(e * 10));