TypeError: 无法删除不可配置的数组元素
消息
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