🐡

JSのconsole.logの思わぬ落とし穴にはまって苦しんだ話

2023/04/20に公開1

結論

  • JSのconsole.logは参照渡し
  • 各時点の値を保持しているのではない
    • 最後に値が確定したらその値で上書きされる?

以下の記事が非常に参考になりました。本当に感謝しかないです。。。
https://qiita.com/POPOPON/items/edc7a522d2ee9a50cc3a

苦労(私)

https://twitter.com/Tebasaki_lab/status/1648970811389411328?s=20

let obj = {
  a: '1'
}
console.log(obj) // => {a: '2'}

obj.a = "2"
console.log(obj) // => {a: '2'}

あとがき

後でわかったのですが、関数の引数も参照渡しなんですね。値渡してると思ってめんどくさいことに。。。console.logも関数の引数だから?オブジェクトは基本参照渡しなんですかね?
https://zenn.dev/okina/articles/c2ecfbb1a23a79

関連ページ

https://zenn.dev/teba_eleven/articles/772c84a522c9c5
https://zenn.dev/teba_eleven/articles/b9adf9e2810954
https://zenn.dev/teba_eleven/articles/bc4e29c9ee6f14

Discussion

Hidden comment
junerjuner

関数の引数も参照渡しなんですね。

参照渡しでいうところの参照渡し (関数の 仮引数に対する代入が実引数に反映される事象)ではなくて、この場合はオブジェクトの状態を変更しているだけなので オブジェクトの破壊的操作ってだけですね。参照値は変わらないです。(値型とごっちゃにされておられますでしょうか?

気になるのであれば structuredClone をお勧めします。

https://developer.mozilla.org/ja/docs/Web/API/Window/structuredClone