web-dev-qa-db-ja.com

JavaScriptでdeleteを使用して要素をnullに設定するのはいつですか?

可能性のある複製:
JavaScriptでのオブジェクトの削除

多数のプロパティを持つJSオブジェクトがあります。ブラウザにこのオブジェクトのガベージコレクションを強制する場合、これらの各プロパティをnullに設定する必要がありますか、それとも削除演算子を使用する必要がありますか? 2つの違いは何ですか?

66
jeffreyveon

JavaScriptでガベージコレクションを強制する方法はありません。また、実際に行う必要はありません。 x.y = null;およびdelete x.y;両方とも、xの以前の値へのyの参照を削除します。値は、必要に応じてガベージコレクションされます。

プロパティをnullに設定しても、オブジェクトの「セット」と見なされ、列挙されます。deleteを好む場所は、 xのプロパティを列挙します。

以下を考慮してください。

var foo = { 'a': 1, 'b': 2, 'c': 3 };

console.log('Deleted a.');
delete foo.a
for (var key in foo)
  console.log(key + ': ' + foo[key]);

console.log('Nulled out b.');
foo['b'] = null;
for (var key in foo)
  console.log(key + ': ' + foo[key]);

このコードは次の出力を生成します。

Deleted a.
b: 2
c: 3
Nulled out b.
b: null
c: 3
146
Annabelle

Javascriptオブジェクトのプロパティは通常、ハッシュテーブルで実装されます。 nullに設定すると、ハッシュテーブル内のキーはnull値をポイントしたままになり、deleteはキーと値の両方を削除します。

2つの主な違いは、for..inループを使用してキーを反復処理する場合、キーを削除すると、反復処理で表示されるエントリが少なくなることです。

同じキーを繰り返し設定および消去する場合を除き、一般的に削除を好むことをお勧めします。これは、ハッシュテーブル構造をそのままにしておくと主張します。ただし、2つの手法のパフォーマンスの差は、通常の場合には計り知れないほど小さいものです。

-m @

16
Matt DiMeo

JavaScriptで特定の時間にガベージコレクションを強制する方法はありません。各JavaScriptエンジンには、それを処理する独自の方法があります。

ただし、できることは、オブジェクトがどこにも参照されていないことを確認することです。それらをnullに設定するか削除すると、実際には同じことが行われます(deleteはオブジェクトを削除することはありません-オブジェクトへの参照を削除するだけです)。ガベージコレクションが実行されると、指定されたオブジェクトへの参照があるかどうかを確認し、ない場合はメモリから削除します。これは、メモリリークが発生する場所です(JavaScriptオブジェクトがDOMオブジェクトを参照している、またはその逆)。

必ずすべての参照を削除してください。大丈夫です。

1
Gabriel McAdams