はじめに
独学趣味プログラマです。
独学で趣味だと、自分なりの流儀がいろいろとできてきますよね。
命名規則とか、functionを全てアロー関数で書くとか、逆にアロー関数憎し!!とか。
そんな「自分ルール」の一つが、
varは絶対に使わない。
letも極力使わず、constで書く。
でした。深い理由はないです。
varに関してはなんか問題あるって聞いたから。
letではなくconstである理由は、
イミュータブルという概念(というかHaskell)に何となく憧れがあるから。
問題
さて、問題が起こったのは偶然でした。
const todayAt18 = new Date();
todayAt18.setHours(18, 0, 0, 0); // 時間を18時、分、秒、ミリ秒を0に設定
とある文脈で、ChatGPTが提示してきたコードです。
あれ?constなのに変更されてる?
ChatGPTに聞いてみると……
JavaScriptにおいて、
constキーワードで宣言された変数は再代入ができませんが、オブジェクトや配列の内容は変更することが可能です。constは変数が指すメモリアドレスを固定するもので、そのメモリアドレスに格納されているデータの変更を防ぐものではありません。
例えば、
constで宣言されたDateオブジェクトは、そのプロパティ(例えば日付や時間)を変更することができます。以下のコードでは、todayAt18は一度constで宣言されていますが、その後にsetHoursメソッドを使って時間を変更しています。
const todayAt18 = new Date();
todayAt18.setHours(18, 0, 0, 0); // 時間を18時に設定
このコードでは
todayAt18変数自体に新しいオブジェクトを再代入することはできませんが、todayAt18が指すDateオブジェクトの中身(この場合は時間)を変更することは可能です。
え、あ、ほんとに?
解決方法
調べてみたところ、ほんとにそのようです。
つまり、
配列やオブジェクトなら中身をいくらでも変更できる。
まじか……俺信じてたのに……
じゃあconst (定数の意) なんて名前にすんなよ!!全然定数じゃねえよ!!
じゃあconstって何?
簡単に聞いた話ですが、
メモリの先頭を保持してるイメージ
だそうです。なるほど。
だから、配列がいくら変わろうが、lengthが長くなろうが、一向にかまわんというわけですね。
ゆるゆるじゃん……
ただ、配列 in 配列 はできないらしい。
終わりに
定数だけでコードを書いてる俺
に酔ってたのに……
ただのめんどくさいバカじゃん……
と、少し悲しくなりつつ。
とはいえ、constを極力使う意識(イミュータブル)は
いい感じに脳の刺激になってると感じるので
これからも続けていこうと思います。