TypeError: can't delete non-configurable array element
Ngoại lệ JavaScript "can't delete non-configurable array element" xảy ra khi cố gắng rút ngắn độ dài của một mảng, nhưng một trong các phần tử của mảng là non-configurable.
Thông báo
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)
Loại lỗi
TypeError
Nguyên nhân?
Đã cố gắng rút ngắn độ dài của một mảng, nhưng một trong các phần tử của mảng là non-configurable. Khi rút ngắn mảng, các phần tử vượt quá độ dài mảng mới sẽ bị xóa, điều đó thất bại trong tình huống này.
Thuộc tính configurable kiểm soát liệu thuộc tính có thể bị xóa khỏi đối tượng hay không và liệu các thuộc tính của nó (ngoài writable) có thể bị thay đổi hay không.
Thông thường, các thuộc tính trong một đối tượng được tạo bởi array initializer là configurable. Tuy nhiên, ví dụ khi sử dụng Object.defineProperty(), thuộc tính mặc định là không configurable.
Ví dụ
>Thuộc tính non-configurable được tạo bởi Object.defineProperty
Object.defineProperty() tạo ra các thuộc tính non-configurable theo mặc định nếu bạn không chỉ định chúng là configurable.
"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
Bạn cần đặt các phần tử là configurable nếu muốn rút ngắn mảng.
"use strict";
const arr = [];
Object.defineProperty(arr, 0, { value: 0, configurable: true });
Object.defineProperty(arr, 1, { value: "1", configurable: true });
arr.length = 1;
Mảng bị đóng (Sealed Arrays)
Hàm Object.seal() đánh dấu tất cả các phần tử hiện có là non-configurable.
"use strict";
const arr = [1, 2, 3];
Object.seal(arr);
arr.length = 1;
// TypeError: can't delete non-configurable array element
Bạn cần xóa lời gọi Object.seal(), hoặc tạo một bản sao của nó. Trong trường hợp bản sao, việc rút ngắn bản sao của mảng không làm thay đổi độ dài của mảng gốc.
"use strict";
const arr = [1, 2, 3];
Object.seal(arr);
// Sao chép mảng ban đầu để rút ngắn bản sao
const copy = Array.from(arr);
copy.length = 1;
// arr.length === 3