TypeError: can't delete non-configurable array element

Die JavaScript-Ausnahme "can't delete non-configurable array element" tritt auf, wenn versucht wurde, die Länge eines Arrays zu verkürzen, aber eines der Elemente des Arrays ist nicht konfigurierbar.

Nachricht

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)

Fehlerart

Was ist schiefgelaufen?

Es wurde versucht, die Länge eines Arrays zu verkürzen, aber eines der Elemente des Arrays ist nicht konfigurierbar. Beim Verkürzen eines Arrays werden die Elemente, die über die neue Array-Länge hinausgehen, gelöscht, was in diesem Fall fehlschlug.

Das configurable-Attribut steuert, ob die Eigenschaft aus dem Objekt gelöscht werden kann und ob ihre Attribute (außer writable) geändert werden können.

Normalerweise sind Eigenschaften in einem durch einen Array-Initializer erstellten Objekt konfigurierbar. Wenn jedoch zum Beispiel Object.defineProperty() verwendet wird, ist die Eigenschaft standardmäßig nicht konfigurierbar.

Beispiele

Nicht konfigurierbare Eigenschaften, die durch Object.defineProperty erstellt wurden

Die Object.defineProperty() erstellt standardmäßig nicht konfigurierbare Eigenschaften, wenn Sie sie nicht als konfigurierbar angegeben haben.

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

Sie müssen die Elemente als konfigurierbar festlegen, wenn Sie beabsichtigen, das Array zu verkürzen.

js
"use strict";
const arr = [];
Object.defineProperty(arr, 0, { value: 0, configurable: true });
Object.defineProperty(arr, 1, { value: "1", configurable: true });

arr.length = 1;

Versiegelte Arrays

Die Funktion Object.seal() markiert alle vorhandenen Elemente als nicht konfigurierbar.

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

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

Sie müssen entweder den Aufruf von Object.seal() entfernen oder eine Kopie davon machen. Im Fall einer Kopie verändert das Verkürzen der Kopie des Arrays nicht die ursprüngliche Array-Länge.

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

Siehe auch