JavaScript の演算子について少し混乱していますdelete
。次のコードを見てみましょう。
var obj = {
helloText: "Hello World!"
};
var foo = obj;
delete obj;
このコードが実行されると、obj
は になりますnull
が、foo
依然として とまったくobj
同じオブジェクトを参照します。このオブジェクトは を指していたオブジェクトと同じであると推測しますfoo
。
これは私を混乱させます。なぜなら、書き込みによって変数だけでなく、メモリ内で指しているdelete obj
オブジェクトも削除されると思っていたからです。obj
obj
これは、JavaScript のガベージ コレクターが保持/解放ベースで動作しているため、オブジェクトを指す他の変数がない場合、オブジェクトがメモリから削除されるためでしょうか。
(ちなみに、私のテストはSafari 4で行いました。)
ベストアンサー1
delete 演算子は参照のみを削除し、オブジェクト自体は削除しません。オブジェクト自体を削除すると、C++ の delete のように、残りの参照はぶら下がり状態になります。(そのうちの 1 つにアクセスするとクラッシュが発生します。すべてを null にすると、削除時に余分な作業が発生したり、オブジェクトごとに余分なメモリが必要になります。)
Javascript はガベージコレクションされるため、オブジェクト自体を削除する必要はありません。オブジェクトは参照できなくなったときに削除されます。
オブジェクトの使用が終了したら、そのオブジェクトへの参照を削除すると便利です。これにより、ガベージ コレクターは、再利用できるオブジェクトに関する詳細な情報を得ることができます。大きなオブジェクトへの参照が残っていると、プログラムの残りの部分で実際にそのオブジェクトが使用されていなくても、再利用できなくなる可能性があります。