constへの再代入エラーの原因と直し方
constで宣言した変数に再代入しようとしたときに出るエラーです。letやvarと違い、constは一度代入した値を別の値に差し替えることを許しません。
エラーメッセージの読み方
main.js:2
main.js- ファイル名
2- 行番号 — 実際にクラッシュした行
TypeError- 例外クラス — 何が起きたか。ここを検索するのが最短です
Assignment to constant variable.- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 const total = 10; ^ 2 total = 20; 3 console.log(total);
constで宣言した変数への再代入はTypeErrorになります。値を変える必要がある変数はletで宣言します。
直し方: const を let にします。
パターン2
1 const MAX_RETRIES = 3; ^ 2 MAX_RETRIES = 5; 3 console.log(MAX_RETRIES);
定数のつもりでもあとから値を変える設計ならconstは使えません。letに変える必要があります。
直し方: const を let にします。
パターン3
1 function createCounter() { 2 const count = 0; ^ 3 count = count + 1; 4 return count; 5 } 6 console.log(createCounter());
関数内でカウントアップする変数をconstで宣言すると、2回目の代入でエラーになります。
直し方: const を let にします。
パターン4
1 const price = 50; ^ 2 price = 75; 3 console.log(price);
constで宣言した変数への再代入はTypeErrorになります。値を変える必要がある変数はletで宣言します。
直し方: const を let にします。
パターン5
1 function accumulate() { 2 const sum = 0; ^ 3 sum = sum + 10; 4 return sum; 5 } 6 console.log(accumulate());
関数内で加算していく変数をconstで宣言すると、2回目の代入でエラーになります。
直し方: const を let にします。
よくある誤解
constは「値そのものを不変にする」という意味だと誤解されがちですが、正しくは「変数への再代入を禁止する」という意味です。オブジェクトや配列の中身を変えることとは別の話です。
実務での勘所
for (const item of items)のように、ループの中でconstを使っても問題なく動くのは、再代入しているわけではなく、繰り返しのたびに新しいitemという束縛がゼロから作られているためです。同じ変数に代入し直しているのではなく、周回ごとに使い捨ての新しいconstを作っていると考えると、なぜエラーにならないかが腑に落ちます。一方、ループの外で宣言したconst変数の中身をループの中で書き換えようとすると、これは正真正銘の再代入なのでエラーになります。