JavaScriptのオブジェクトの参照に関する仕様を知りたいです

JavaScriptの参照に関して質問がございます。
まずは以下のコードを見ていただきたいです。

JavaScript

1function ListNode(val, next) {2 this.val = (val===undefined ? 0 : val)3 this.next = (next===undefined ? null : next)4}5 6let ans = new ListNode(); //=> 17let ptr = ans; //=> 28 9ans.next = new ListNode(1);10console.log(ans) //=> 311//=> {12// "val": 0,13// "next": {14// "val": 1,15// "next": null16// }17//}18console.log(ptr) //=> 419//=> {20// "val": 0,21// "next": {22// "val": 1,23// "next": null24// }25//}26ans = ans.next //=> 527ans.next = new ListNode(2); //=> 628console.log(ptr) //=> 729//{30// "val": 0,31// "next": {32// "val": 1,33// "next": {34// "val": 2,35// "next": null36// }37// }38//}

以下自分の理解を書いていきます。間違いがあったら指摘いただきたいです。(コメントの番号と下のリストの番号は連携しています)

  1. LIstNodeオブジェクトをans変数が参照する。
  2. ptrがansから参照をを渡される。この時点で、ptrとansは同じオブジェクトを参照する。
  3. ansのnextプロパティにオブジェクトが挿入される。当然ansのオブジェクトのnextプロパティは変更される。
  4. ptrもansと同じオブジェクトを参照しているので、ptrのconsole.logもansと同じように変更される。
  5. ans変数の参照が3番で挿入されたオブジェクトに切り替わる。
  6. 5番で新しく切り替わったオブジェクトに新しいListNodeオブジェクトが挿入される。
  7. ptrにはansで5番で切り替わったオブジェクトの参照を渡されていないため、ptrとansは同じオブジェクトを参照しなくなる。

ここまでが自分の理解です。
ただ、最後のptrが今までnextに挿入した値(すなわちval0からval2まで)を全て保持しているのがなぜなのかがわかりません。
・ptrはまだansを参照し続けているということなのでしょうか?
・しかし、7番でptrとansは同じオブジェクトを参照しなくなったはずでは。。。。?
・仮に参照しているとしても、ansにはListNodeオブジェクトが1階層しか挿入されていないのに,
ptrには3階層分挿入されている。。。?
と混乱しております。

何卒ご回答の程よろしくお願い申し上げます。

コメントを投稿

0 コメント