世の中には消せるものと消せないものがあるみたいです。
non-configurableって何さ
この単語がリファレンスで出てきてわかんなかったのが始まり。
Object.defineProperty():MDN
このメソッドのプロパティにconfigurable
発見。
説明を見ると、
true である場合のみ、この種の記述子を変更することや、対応するオブジェクトからプロパティを削除することができます。
既定値は false です。
とおっしゃってます。
non-configurable
はさしずめ削除できませんってとこでしょうか。
https://uhyohyo.net/javascript/11_4.html
こちらのプロパティスクリプタの説明では、Object.getOwnPropertyDescriptor
を使って
プロパティのconfigurable
の属性がどうなっているかチェックできるようです。
deleteできるもの・できないもの
まず忘れてはいけないこと。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Errors/Delete_in_strict_mode
JavaScript では、通常の変数を delete 演算子で削除できません。strict モードで、変数を削除しようとするとエラーがスローされ、削除できません。
delete 演算子は、オブジェクトのプロパティのみ削除できます。オブジェクトプロパティは、設定可能な場合は "修飾" されます
変数、strictモードだと消せないんですね。
そしてconfigurable
のみがdelete可能なようです。
deleteの戻り値
消せたらtrue
,消せなかったらfalse
が戻ります。
deleteと配列(lengthについて)
let animals =['cat','chicken','hen'];
delete animals[0];
console.log(animals); //[empty,'chicken','hen']
console.log(animals.length); //3
このように、配列をdelete
してもlength
は変わらないので要注意!ですね。
deleteとプロトタイプ
function Foo(){};
Foo.prototype.bar = 1;
let foo = new Foo();
delete foo.bar; //戻り値はtrueだが、消えない
console.log(foo.bar); //1と表示されてしまう。
プロトタイプから継承されているプロパティを削除するには、以下のように削除します。
delete foo.prototype.bar;
console.log(foo.bar); // TypeError