次のようにJavaScriptでオブジェクトとそのプロパティを作成したとしましょう-
var obj = {};
obj['bar'] = 123;
obj['bar']['foo'] = new Array();
obj['bar']['xyz'] = new Array();
この後、要素を2つの配列にプッシュします。それから私が書くなら
delete obj['bar'];
2つのアレイも削除されますか?
次のようにJavaScriptでオブジェクトとそのプロパティを作成したとしましょう-
var obj = {};
obj['bar'] = 123;
obj['bar']['foo'] = new Array();
obj['bar']['xyz'] = new Array();
この後、要素を2つの配列にプッシュします。それから私が書くなら
delete obj['bar'];
2つのアレイも削除されますか?
2つのアレイも削除されますか?
他に参照がない場合は、ガベージコレクションの対象になります。そして、そのコードに基づいて、何もしません。それらが実際にクリーンアップされる時期とかどうかは、実装次第です。
bar
ただし、コードが非常に奇妙なことをしているため、削除する前でもGCの対象となることに注意してください。コメントを参照してください:
// Creates a blank object, so far so good.
var obj = {};
// Sets the `bar` property to the number 123.
obj['bar'] = 123;
// Retrieves the value of `bar` (the primitive number 123) and
// *converts* it into a `Number` instance (object), then
// creates a property on that object called `foo`, assigning a
// blank array to it. Because the Number object is never stored
// anywhere, both it and the array are IMMEDIATELY eligible for
// garbage collection. The value of `obj['foo']` is unaffected,
// it remains a primitive number.
obj['bar']['foo'] = new Array();
// The same happens again, a temporary Number instance and
// array are created, but both are IMMEDIATELY eligible for
// garbage collection; the value of `obj['bar']` is unaffected.
obj['bar']['xyz'] = new Array();
したがって、削除する必要はありませんでしbar
た。アレイは即座にガベージコレクションの対象となりました。これは、JavaScriptでは、数値はオブジェクトに自動的に昇格できるプリミティブであるために発生しますがNumber
、プリミティブ番号が割り当てられているプロパティの値には影響しません。それで:
var obj = {};
obj['bar'] = 123;
obj['bar']['foo'] = []; // [] is a better way to write new Array()
console.log(obj['bar']['foo']); // "undefined"
行を次のように変更した場合obj['bar'] =
:
obj['bar'] = {};
また
obj['bar'] = []; // Arrays are objects
...その後、foo
プロパティはすぐには消えず、クリーンアップされるxyz
まで配列は残ります。bar
delete
それ自体は配列をクリアしませんが、それらへの既存の参照のみを削除します。それらへの参照を別の場所でキャプチャしない限り、はい、その後は参照がないため、GCによって要求されます。
いつ、どのように、またはそれらのメモリが実際にGCによって再利用されるかどうかは、実装によって異なります。
はい、obj['bar']
プロパティを削除して、関連する配列obj['bar']
をガベージコレクションの対象にすることができます(他にそれらへの参照がない場合)。
できませんdelete obj
。obj = null;
ただし、潜在的なガベージコレクションのためにobjのプロパティを解放するために使用できます。
このjsfiddleでわかるように、何かが正常に削除された場合、delete
関数は戻ります。true
alert(delete obj['bar']); // alerts true;
ただし、変数または関数を削除することはできません。
var x = 2;
alert(delete x); // alerts false;
function x(){};
alert(delete x); // alerts false;
詳細については、JavaScriptのdelete
機能に関するすばらしい記事をご覧ください:http://perfectionkills.com/understanding-delete/