旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

javascriptの代入について

2007年7月25日

javascriptの代入について、
いまさら不安に思ったことがあるのでまとめる
まずこのコード

var foo = {a:1, b:2};
var tmp = foo;
tmp.a = 256;
alert(foo.a); // -> 256

fooをtmpに参照渡しして、参照渡しされたtmp.aを更新するとfoo.aも更新されているという趣旨

一方このコード
別段なんでもないコードですが・・・

var bar = {c:3, d:4};
var baz = {e:5, f:6};
var tmp = bar;
tmp = baz;
alert(bar.e); // -> undefined つまりbaz で書き換えられてない

・・・「tmpとbarが等しいなら、tmp = baz は bar = baz と同じ意味になり
その結果、bar.e は baz.e と等しくなってもおかしくは無いんじゃないかな」と一瞬思いました。
(普段そうならないので、ならないのはわかってましたが)

なんでかなーと考えると
「代入による左辺の更新というのは、常に(実体データへの)参照のみを更新しているだけ」というのが理由じゃないかと。

例えば
tmp = “str” という値渡しの際には
(1) “str”がメモリ上に実体データを作成し、
(2) tmp には今作成されたてホヤホヤの実体データの参照が入る。

先ほどの後者の例では
(1) var tmp = bar で、tmpへbarの実体データへの参照が入り
(2) tmp = baz で、tmpへbazの実体データへの参照が入るだけでbarの実体データは無関係。

という感じに。

代入では、実体データは全く無関係なので、
そのために、参照が切れていることをトリガーに、ガーベッジコレクションが実体データの開放を行わないといけない訳か。

(実体データの上書きってのも、実は新たなデータを作ってその参照を渡してやってるだけなのかも・・・この辺は気分が乗ったら調べよう)

いつものことですが、間違えてたらすみません。