Spec-Zone.ru › JavaScript

RangeError: недопустимая длина массива

JavaScript-исключение "Invalid array length" возникает при указании длины массива, которая является отрицательной, дробным числом или превышает максимальную, поддерживаемую платформой (т.е. при создании Array или ArrayBuffer, или при установке свойства length).

Максимально допустимая длина массива зависит от платформы, браузера и версии браузера. Для Array максимальная длина составляет 232-1. Для ArrayBuffer максимальная длина составляет 231-1 (2GiB-1) в 32-битных системах. Начиная с версии Firefox 89, максимальное значение ArrayBuffer составляет 233 (8GiB) в 64-битных системах.

Примечание: Array и ArrayBuffer являются независимыми структурами данных (реализация одной не влияет на другую).

Сообщение

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)

Тип ошибки

RangeError

Что пошло не так?

Ошибка может появиться при попытке создания Array или ArrayBuffer с недопустимой длиной, включая:

  • Отрицательная длина, через конструктор или при установке свойства length.
  • Нецелочисленная длина, через конструктор или при установке свойства length. (Конструктор ArrayBuffer приводит длину к целочисленному типу, а конструктор Array — нет.)
  • Превышение максимальной длины, поддерживаемой платформой. Для массивов максимальная длина составляет 232-1. Для ArrayBuffer максимальная длина составляет 231-1 (2GiB-1) в 32-битных системах или 233 (8GiB) в 64-битных системах. Это может произойти через конструктор, при установке свойства length или при использовании методов массива, которые неявно устанавливают свойство length (таких как push и concat).

Если вы создаете Array с помощью конструктора, вам, вероятно, следует использовать литеральную нотацию вместо этого, так как первый аргумент интерпретируется как длина Array. В противном случае вам может потребоваться ограничить длину перед установкой свойства length или использованием его в качестве аргумента конструктора.

Примеры

Недопустимые случаи

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);
}

Допустимые случаи

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

См. также

  • Array
  • length
  • ArrayBuffer

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API