再代入の可否とは
変数に一度入れた値を「あとから別の値に入れ替えられるかどうか」です。JavaScriptでは宣言のしかた(let / const)で可否が変わります。
宣言キーワードごとの違い
- let: 再代入が「できる」
let score = 50;
score = 80; // OK
console.log(score); // 80
JavaScript- const: 再代入が「できない」
const pi = 3.14;
pi = 3.14159; // エラー(TypeError)
JavaScript- 指針: 変わる値は let、変わらない値は const。迷ったら constで始め、必要になったら letに切り替える。
constでも「中身の変更」はできる場合がある
constは「変数が指す参照を変えられない」だけ。オブジェクトや配列の“中身”は変更できます。
- オブジェクトの中身変更(再代入ではない)
const user = { name: "Taro", age: 20 };
user.age = 21; // OK(プロパティ更新)
console.log(user.age); // 21
// user = { ... } は再代入 → NG
// user = { name: "Hanako" }; // エラー
JavaScript- 配列の中身変更(要素の追加など)
const nums = [1, 2, 3];
nums.push(4); // OK(中身の変更)
console.log(nums); // [1, 2, 3, 4]
// nums = [9, 9]; は再代入 → NG
JavaScript- 完全に不変にしたい場合
const settings = Object.freeze({ theme: "dark" });
settings.theme = "light"; // 失敗(変更されない)
JavaScriptよくあるつまずきポイント
- 再宣言は別の話: 同じスコープ内で同じ名前をもう一度「宣言」すること。
- let/const: 再宣言は不可
- var: 再宣言できてしまう(推奨されない)
let x = 1;
// let x = 2; // エラー(同じスコープで再宣言は不可)
JavaScript- ループのカウンタは letを使う: 値が変化する前提だから。
for (let i = 0; i < 3; i++) {
console.log(i);
}
JavaScript- constの初期化は必須: 値なしで宣言するとエラー。
// const a; // エラー
const a = 10; // OK
JavaScript使い分けの実践ガイド
- 基本は const: 変更の可能性がない値(設定、固定メッセージ、関数参照など)
const TAX_RATE = 0.1;
const toYen = amount => Math.round(amount);
JavaScript- 変更が必要なら let: 入力値の更新、カウンタ、状態のトグルなど
let isOpen = false;
isOpen = !isOpen; // 再代入で状態切り替え
JavaScriptミニ練習
- 問1: 次のコードでエラーになる行はどれ?
const name = "Taro";
let age = 20;
age = 21;
name = "Hanako"; // ここがエラー
JavaScript- 問2: 以下のコードは動く?結果は?
const arr = [1, 2];
arr.push(3); // OK
// arr = [9]; // NG(コメントアウト)
console.log(arr); // [1, 2, 3]
JavaScript- 問3: 価格に税を加算していくケース、正しい宣言は?
const TAX = 0.1; // 変わらないので const
let price = 1000; // 更新するので let
price = price * (1 + TAX);
JavaScriptまとめ
- 再代入できるのは let、できないのが const。
- constでも参照先の“中身”は変更可能(オブジェクト/配列)。
- 不変にしたいなら Object.freeze を使う。
- 原則 const、必要なら let にするのが安全で読みやすい。
