TypeError: can't delete non-configurable array element
Fehlermeldung
TypeError: can't delete non-configurable array element (Firefox) TypeError: Cannot delete property '2' of [object Array] (Chrome)
Fehlertyp
Was ist falsch gelaufen?
Es wurde versucht die Länge eines Arrays zu kürzen obwohl eines der Arrayelemente nicht Konfigurierbar(non-configurable) ist. Beim Kürzen eines Arrays werden die Elemente hinter der neuen Länge gelöscht, was in dieser Situation nicht funktioniert.
Das configurable
Attribut kontrolliert, ob eine Eigenschaft von einem Objekt gelöscht werden kann und seine Attribute (anders als writable
) geändert werden können.
Eigenschaften von einem Objekt, dass von einem Array-Initialisierer erstellt wurden, sind konfigurierbar. Immer, wenn zum Beispiel Object.defineProperty()
(en-US) eingesetzt wird, ist die Eigenschaft nicht ohne weiteres konfigurierbar.
Beispiele
Nicht konfigurierbare Eigenschaften mit Object.defineProperty
erstellen
Die Object.defineProperty()
(en-US) Funktion erstellt nicht konfiguriertbare Eigenschaften wenn sie nicht extra als konfigurierbar spezifiziert sind.
var arr = [];
Object.defineProperty(arr, 0, {value: 0});
Object.defineProperty(arr, 1, {value: "1"});
arr.length = 1;
// TypeError: can't delete non-configurable array element
Die Elemente müssen als Konfigurierbar eingestellt werden, wenn das Array später im Quelltext gekürzt werden soll.
var arr = [];
Object.defineProperty(arr, 0, {value: 0, configurable: true});
Object.defineProperty(arr, 1, {value: "1", configurable: true});
arr.length = 1;
Ein Array versiegeln (seal
)
Die Object.seal()
(en-US) Funktion markiert alle existirenden Elements als nicht Konfugurierbar.
var arr = [1,2,3];
Object.seal(arr);
arr.length = 1;
// TypeError: can't delete non-configurable array element
Man muss den Aufruf von Object.seal()
(en-US) entfernen oder ein Kopie des Arrays machen. Im fall einer Kopie führt das Kürzen des kopierten Arrays zu keiner Änderung des Original Arrays.
var arr = [1,2,3];
Object.seal(arr);
// Copy the initial array to shorten the copy
var copy = Array.from(arr);
copy.length = 1;
// arr.length == 3