MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

TypeError: can't delete non-configurable array element

メッセージ

TypeError: can't delete non-configurable array element (Firefox)
TypeError: Cannot delete property '2' of [object Array] (Chrome)

エラータイプ

TypeError

何がうまくいかなかったのか?

配列を短縮しようとしていますが、配列の要素が変更不可です。配列の短縮をするとき、新しい配列の長さを超える要素は削除されますが、このシチュエーションでは失敗します。

configurable 属性はプロパティをオブジェクトから削除できるかどうか、および (writable 以外の) 変更できるかどうかを制御します。

通常、配列初期化子で生成されたオブジェクトのプロパティは変更可能です。しかし、たとえば Object.defineProperty() が使用された場合、既定でプロパティを変更できません。

Object.defineProperty で生成した変更不可能なプロパティ

プロパティを変更できないように指定する場合、Object.defineProperty() は既定で変更できないプロパティを生成します。

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

配列を短縮したい場合、要素を変更可能に設定する必要があります。

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

arr.length = 1;

シールされた配列

Object.seal() 関数はすべての存在する要素を設定不可にします。

var arr = [1,2,3];
Object.seal(arr);

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

Object.seal() の呼び出しを削除するか、配列のコピーを取る必要があります。コピーの場合、コピーした配列の短縮は元の配列の長さに影響しません。/p>

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

関連項目

ドキュメントのタグと貢献者

 このページの貢献者: YuichiNukiyama
 最終更新者: YuichiNukiyama,