Spec-Zone.ru › JavaScript

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)

Тип ошибки

TypeError

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

Была предпринята попытка сократить длину массива, но один из элементов массива является ненастраиваемым. При сокращении массива элементы, находящиеся за пределами новой длины массива, будут удалены, что в данной ситуации не удалось.

Атрибут 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

См. также

  • [[Configurable]]
  • length
  • Object.defineProperty()
  • Object.seal()

© 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

Spec-Zone.ru

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