TypeError: невозможно удалить ненастраиваемый элемент массива
Исключение JavaScript "can't delete non-configurable array element" (невозможно удалить ненастраиваемый элемент массива) возникает, когда была предпринята попытка сократить длину массива, но один из элементов массива является ненастраиваемым.
Сообщение
TypeError: Cannot delete property '1' of [object Array] (V8-based) TypeError: can't delete non-configurable array element (Firefox) TypeError: Unable to delete property. (Safari)
Тип ошибки
Что пошло не так?
Была предпринята попытка сократить длину массива, но один из элементов массива является ненастраиваемым. При сокращении массива элементы, находящиеся за пределами новой длины массива, будут удалены, что в данной ситуации не удалось.
Атрибут configurable контролирует, может ли свойство быть удалено из объекта и могут ли быть изменены его атрибуты (кроме writable).
Обычно свойства в объекте, созданном с помощью инициализатора массива, являются настраиваемыми (configurable). Однако, например, при использовании Object.defineProperty(), свойство по умолчанию не является настраиваемым.
Примеры
Ненастраиваемые свойства, созданные с помощью Object.defineProperty
Object.defineProperty() по умолчанию создает ненастраиваемые свойства, если вы не указали их как настраиваемые.
"use strict";
const arr = [];
Object.defineProperty(arr, 0, { value: 0 });
Object.defineProperty(arr, 1, { value: "1" });
arr.length = 1;
// TypeError: can't delete non-configurable array element
Вам потребуется установить элементы как настраиваемые (configurable), если вы собираетесь сократить массив.
"use strict";
const arr = [];
Object.defineProperty(arr, 0, { value: 0, configurable: true });
Object.defineProperty(arr, 1, { value: "1", configurable: true });
arr.length = 1;
Запечатанные массивы
Функция Object.seal() помечает все существующие элементы как ненастраиваемые.
"use strict"; const arr = [1, 2, 3]; Object.seal(arr); arr.length = 1; // TypeError: can't delete non-configurable array element
Вам либо нужно удалить вызов Object.seal(), либо создать копию массива. В случае копии, сокращение копии массива не изменяет длину исходного массива.
"use strict"; const arr = [1, 2, 3]; Object.seal(arr); // Copy the initial array to shorten the copy const copy = Array.from(arr); copy.length = 1; // arr.length === 3
См. также
© 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/Non_configurable_array_element