Hatena::Diary

からすの日記

2009-02-11

[]deleteの使い方についてのメモ

javascript版AutoReleasePoolを作ろうといろいろ調べたら、

deleteの使い方を誤解していたことがわかったのでメモ。

deleteの間違った使い方

a = new Date();//オブジェクトを作る
b = a;         //アドレスをコピー

delete a;      //Dateオブジェクトを削除しているつもり

document.write(b); //-> 時間が出力される

C++的に考えると、オブジェクトは四行目の時点で破壊され、bはundefinedとでも表示されそうな物ですが、実際は読み出せてしまいます。

では、二行目の時点でオブジェクトがコピーされているのかと考えるとそうでもなく、ちゃんと参照だけがコピーされています。

deleteの正しい使い方

そもそもjavascriptにはGCがあり、オブジェクトを解放させたいのなら全ての変数をnullで上書きするなりして、誰からも参照されない状態を作るのが正しいやり方なのですが、

じゃあdeleteは何のために存在するのかというと、プロパティーを削除するためにあります。

例えば、ハッシュでキーと値の両方を削除したいときに、

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

h["c"]=undefined;	//<

for( var i in h) {//キーごとに繰り返し(キーが存在したら実行)
	document.write("h["+i+"]="+h[i]+"<br />");
}

という形で書いてしまうと、

h[a]=1
h[b]=2
h[c]=undefined

と出力されてしまい、キーがそのまま残ります。

一方deleteを使って

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

delete h["c"];	//<

for( var i in h) {
	document.write("h["+i+"]="+h[i]+"<br />");
}

の様に書くと

h[a]=1
h[b]=2

と出力されて、意図した通り動いていることがわかります。

つまり

deleteはnewと対をなしてオブジェクトを破壊する演算子ではなく、

オブジェクトのプロパティーを削除する演算子でした。

参考

こっちに書かれている方が詳しくてわかりやすいです。

delete Operator - MDC(英語)

JavaScript の変数と delete 演算子: Days on the Moon

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/n-karasu/20090211/1234325858