TypeError: 无法删除不可配置的数组元素

当尝试 缩短数组的长度 时,会发生 JavaScript 异常 "无法删除不可配置的数组元素",但数组中的某个元素是 不可配置 的。

消息

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)。

通常,通过 数组初始化器 创建的对象中的属性是可配置的。但是,例如,当使用 Object.defineProperty() 时,属性默认情况下不可配置。

示例

通过 Object.defineProperty 创建的不可配置属性

如果您没有将它们指定为可配置,则 Object.defineProperty() 默认情况下会创建不可配置的属性。

js
"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

如果您打算缩短数组,则需要将元素设置为可配置。

js
"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() 函数将所有现有元素标记为不可配置。

js
"use strict";
const arr = [1, 2, 3];
Object.seal(arr);

arr.length = 1;
// TypeError: can't delete non-configurable array element

您要么需要删除 Object.seal() 调用,要么制作副本。如果是副本,缩短数组副本不会修改原始数组的长度。

js
"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

另请参阅