LoginSignup
0
1

More than 3 years have passed since last update.

【JavaScript】deleteあれこれ(non-configurable)

Posted at

世の中には消せるものと消せないものがあるみたいです。

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について)

lengthとdelete
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
delete foo.prototype.bar;
console.log(foo.bar);     // TypeError
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1