マイクサミュエル氏は答えて指摘しているように、削除の最も一般的な使い方の1つは、名前を値に関連付ける「プロパティバッグ」としてオブジェクトを扱うときです。論理的には、「この名前は現在、いくつかの偽の値にマップされている」と「この名前は全くマッピングされていません」との間に違いがあります。 "削除"は後者を達成する。
それはすべてかなり合理的に理解されています。私は、JScript 1.0から5.0のエンジンに関する興味深い履歴ノートを追加すると思っていました。
MicrosoftのJScript実装では、OLEオートメーションスタイルのIDispatchオブジェクトを使用して、拡張オブジェクトを実装しました。 IDispatchはもちろん、名前を「ディスパッチid」(単純に整数)に関連付けることによって動作します。動的に呼び出すには、まず、ディスパッチオブジェクトに名前に関連付けられたディスパッチIDを渡すように依頼し、次に「これらの引数を指定して、このIDに関連付けられたメソッドを呼び出す」と言う。
これはすべてうまくいいです。しかし、IDispatch契約の要件の1つは、名前からディスパッチIDへのマッピングがオブジェクトの全寿命にわたって安定するであることです。だから、もし誰かが "このオブジェクトにFooプロパティを追加する"と言うと、プロパティFooがそのオブジェクトのディスパッチ識別子0x1234に関連付けられていると判断するかもしれません。その時刻から、毎回のオブジェクトはディスパッチ識別子 "Foo"を要求されますが、Fooが削除されてから再び追加されても0x1234、を返す必要があります。これにより、呼び出し側は常に呼び出しごとにオブジェクトに尋ねるのではなく、名前/設定のペアの高速キャッシュを維持することができます。
実用的なことは、です。「削除」は、その実装におけるオブジェクトのメモリ負担を少しでも軽減します。!オリジナルの実装でプロパティを削除するときは、そのディスパッチ識別子を削除済みとしてマークするオブジェクトにビットを追加する必要がありますが、その名前が戻った場合の名前/ IDのペアリングに関する情報をすべて保持する必要があります。膨大な数のプロパティをオブジェクトに追加し、それらのすべてを削除しても、メモリ内のオブジェクトは縮小されません。
JScriptエンジンは私の時間(パーサーとレクサーを除く)から完全に書き直されているので、エンジンにまだこのような奇妙なことがあるかどうかはわかりません。見つけ出すのは面白いだろう。
'delete'の動作は全く複雑ではありません。しかし** **本当に**は削除と呼ばれるべきではありません。 JavaScriptはC++と構文的に似ていますが、演算子C++を使用していますが、これとはまったく異なる*を実行することはちょっとのおしゃれであり、この混乱の原因となっています。 (もしそれが 'remove'と呼ばれていたら、私は人々がほとんど混乱しないだろうと確信している) –
http://perfectionkills.com/understanding-delete/ – Raghu