Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

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. (Der ArrayBuffer-Konstruktor zwingt die Länge zu einem Integer, der Array-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 ArrayBuffer beträ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 der length-Eigenschaft oder durch Array-Methoden, die implizit die Länge setzen (wie push und concat), 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

js
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

js
[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));

Siehe auch