3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

信じてたのに裏切られた気分(JSのconstは変更可能←)

Posted at

はじめに

独学趣味プログラマです。

独学で趣味だと、自分なりの流儀がいろいろとできてきますよね。
命名規則とか、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を極力使う意識(イミュータブル)は
いい感じに脳の刺激になってると感じるので
これからも続けていこうと思います。

3
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?