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の実体データは無関係。
という感じに。
代入では、実体データは全く無関係なので、
そのために、参照が切れていることをトリガーに、ガーベッジコレクションが実体データの開放を行わないといけない訳か。
そのために、参照が切れていることをトリガーに、ガーベッジコレクションが実体データの開放を行わないといけない訳か。
(実体データの上書きってのも、実は新たなデータを作ってその参照を渡してやってるだけなのかも・・・この辺は気分が乗ったら調べよう)
いつものことですが、間違えてたらすみません。