TypeError: can’t delete non-configurable array element
Der JavaScript-Ausnahmefehler "can't delete non-configurable array element" tritt auf, wenn versucht wurde, die Länge eines Arrays zu verkürzen, aber eines der Array-Elemente ist nicht konfigurierbar.
Meldung
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
TypeError
Was ging schief?
Es wurde versucht, die Länge eines Arrays zu verkürzen, aber eines der Array-Elemente ist nicht konfigurierbar. Beim Kürzen eines Arrays werden die Elemente jenseits der neuen Array-Länge gelöscht, was in dieser Situation fehlgeschlagen ist.
Das Attribut configurable kontrolliert, 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 beispielsweise Object.defineProperty() verwendet wird, ist die Eigenschaft standardmäßig nicht konfigurierbar.
Beispiele
>Nicht konfigurierbare Eigenschaften, die durch Object.defineProperty erstellt wurden
Die Object.defineProperty()-Methode erstellt standardmäßig nicht konfigurierbare Eigenschaften, wenn Sie sie nicht als konfigurierbar spezifiziert 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() kennzeichnet 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 Object.seal()-Aufruf entfernen oder eine Kopie davon erstellen. Im Fall einer Kopie beeinträchtigt das Verkürzen der Kopie des Arrays nicht die originale 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