※2008/01/24に一部加筆しました。
この記事の値のコピーについて誤った記述がありましたので
文字列変数コピーは参照コピーである:福井プログラマー生活向上委員会
しかし、この説明では一つ問題があります。
なぜなら、JavaScriptやActionScript3のString型は、プリミティブ型ではあるものの、変数のコピーは値コピーではなく参照コピーになるからです。それどころか、ActionScript3では全てのプリミティブ型のコピーは参照コピーになるようです
こちらの記事を是非合わせてお読みいただくことをおすすめします!!
コリン・ムック「今から始めるActionScript 3.0」に行ってきました。
http://www.event-web.net/as3/
今コリン・ムックのレクチャーから帰ってきました。
初心者向けのレクチャーではありましたが、9時間の長丁場。
内容の方は、ビギナー向けということもあり易しめで、難しいところもありませんでした。
コリン節を堪能してきましたよ。
僕はAS2.0の時に、コリン氏のMVC Clockのソースを穴があくほど読んで、初めてMVCという概念を勉強したので師匠を拝むような気持ちでした。
で、基本的には「ActionScript3でどうやってアプリケーションを開発していくか」という課題をひとつのサンプルアプリを通して、疎結合に作っていく大切さを表現していました。
前半はAS3の言語的な部分に多く触れ、後半はMVCやディスプレイオブジェクト、イベントなどの実装寄りな話。
コリン氏は「変数」と「オブジェクト」の関係を正しく理解してもらいたいと何度か言っておりました。
そのわかりやすさに衝撃を受けたので、メモします。
- 「変数には値そのものが格納されているわけじゃない。変数は値の参照を持っているだけ」
- 「変数はコンテナではない。参照を持つ事のみ可能。本来のコンテナはシステムメモリ」
と同じことを何度もいっていたので、よほど覚えて帰ってほしかったのでしょう。
例えばプリミティブ型(NumberやString)では
var a = "dog";
var b = a;
としたとき、「dog」というオブジェクトがコピーされています。

追記:
文字列変数コピーは参照コピーである:福井プログラマー生活向上委員会の記事を参照してください。
a = "cat";
trace(a); // output 'cat'
trace(b); // output 'dog'
この時2つの変数の間でオブジェクトは共有されていません。
では、複合データ型の場合
var a = [0,1,2,3];
var b = a;
a[0] = 10;
trace(a); // output '[10,1,2,3]'
trace(b); // output '[10,1,2,3]'

2つの変数は同じオブジェクトを参照しています。
ここまでは問題ないかと。
ではさらに突っ込んで、「参照」とは何かを説明すると
a = null;
trace(b); // output '10,1,2,3'
これはちょっと変だと思う人もいるかも。
nullはオブジェクトを捨てる事ではなく、参照を切るだけ

図を見ると、「変数a」と「配列[10,1,2,3]」を繋ぐ線が消えただけだということが良くわかる。変数が持っているのは、この「線」の部分だけだということ。
では
とすると、オブジェクト[10,1,2,3]は消えたのでしょうか?
答えはノーです。

どの変数からも参照されなくなったオブジェクトはやがてメモリから捨てられます。
これをガベッジコレクションといいますが、どの変数からも参照されなくなった時点で削除されるのではなく、捨てる準備。捨ててもいいよというマークがされて適当な時にGCされます。
その適当な時とは?
コリン氏がいうには、ロードをやめたり、重い処理をストップさせたりした場合らしいです。
AS3ではビルトインではないけれど、強制的にガベッジコレクションを実行するハックもあるので
それを使うのもありですかね。
http://www.gskinner.com/blog/archives/2006/08/as3_resource_ma_2.html
個人的にこのオブジェクトの話は、わかってはいても人に説明しづらい。理解したつもりでも、なんかずれていた。という経験があるので、この参照を矢印で表現する図解はためになりました。
今日のレクチャーの内容は
http://moock.org/lectures/groundUpAS3/にあります。
--
追記:
コリン・モック氏本人がレクチャーで使っていた図解は
http://moock.org/lectures/groundUpAS3/の
・copies and references
・multiple references to the same object
にありました。
SWFなのでクリックして紙芝居的に挙動が確認できます。