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

另見