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.
"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.
"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.
"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.
"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