2009-02-11
■[javascript]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と対をなしてオブジェクトを破壊する演算子ではなく、
オブジェクトのプロパティーを削除する演算子でした。
参考
こっちに書かれている方が詳しくてわかりやすいです。
- 4 http://ueda2005.hp.infoseek.co.jp/index.html
- 4 http://www.google.co.jp/search?hl=ja&q=javascript+getelementsbyattribute&btnG=Google+検索&meta=lr=&aq=0&oq=javascript+getelementsbyatt
- 4 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLG,GGLG:2005-47,GGLG:ja&q=prototype.js+クリックしたら
- 3 http://ueda2005.hp.infoseek.co.jp/
- 3 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&q=C+パーサ 簡易&btnG=検索&lr=lang_ja
- 2 http://d.hatena.ne.jp/pideno/
- 2 http://d.hatena.ne.jp/pideno/20090217/1234884317
- 2 http://www.google.co.jp/search?hl=ja&lr=lang_ja&ei=5uWYSa3iCZKwkAWP-4SjCw&sa=X&oi=spell&resnum=1&ct=result&cd=1&q=document.getelementsbyattribute&spell=1
- 2 http://www.google.co.jp/search?hl=ja&q=JScript+delete&meta=lr=&aq=f
- 2 http://www.google.co.jp/search?hl=ja&q=moro 乱数&lr=