TypeError: can't delete non-configurable array element
当尝试缩短数组的长度,但其中一个数组元素是不可配置的时,会发生 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)
错误类型
TypeError
哪里出错了?
尝试缩短数组的长度,但其中一个数组元素是不可配置的。缩短数组时,超出新数组长度的元素将被删除,但在此情况下操作失败。
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