TypeError: can't delete non-configurable array element(Тип ошибки:не удаётся удалить настраиваемый элемент массива)
Сообщения
TypeError: не удаётся удалить не настраиваемый элемент массива (Firefox) TypeError: не удаётся удалить свойство '2' из [массива объектов] (Chrome)
Тип ошибки
Что пошло не так?
Была сделана попытка сократить длину массива, но один из элементов массива не изменяется. При укорочении массив, элементы за новую длину массива будут удалены, не в этой ситуации.
Настраиваемый атрибут определяет, можно ли удалить свойство из объекта и можно ли изменить его атрибуты (отличные от доступных для записи).
Обычно свойства объекта, созданного инициализатором массива, настраиваются. Однако, например, при использовании Object.defineProperty()
, свойство не настраивается по умолчанию.
Examples
Не настраиваемые свойства, созданные Object.defineProperty
The Object.defineProperty()
создаёт не настраиваемые свойства по умолчанию, если они не указаны как настраиваемые.
var arr = [];
Object.defineProperty(arr, 0, { value: 0 });
Object.defineProperty(arr, 1, { value: "1" });
arr.length = 1;
// TypeError: не удаётся удалить не настраиваемый элемент массива
Вам нужно будет установить элементы как конфигурируемые, если вы собираетесь сократить массив.
var arr = [];
Object.defineProperty(arr, 0, { value: 0, configurable: true });
Object.defineProperty(arr, 1, { value: "1", configurable: true });
arr.length = 1;
Seal
-ed Arrays (Герметичные Массивы)
The Object.seal()
функция помечает все существующие элементы как не настраиваемые.
var arr = [1, 2, 3];
Object.seal(arr);
arr.length = 1;
// TypeError: can't delete non-configurable array element
Вам или нужно извлечь Object.seal()
позвоните или сделайте копию. В случае копирования сокращение копии массива не изменяет длину исходного массива.
var arr = [1, 2, 3];
Object.seal(arr);
// Скопируйте исходный массив, чтобы сократить копию
var copy = Array.from(arr);
copy.length = 1;
// arr.length == 3