JavaScript | 基礎構文:変数・定数 – let と const の違い

JavaScript
スポンサーリンク

初心者向け:let と const の違い

JavaScriptで変数を宣言する方法のうち、もっともよく使うのが let と const です。両者の「再代入の可否」「スコープ」「挙動の違い」を押さえると、バグの少ないコードが書けます。


ざっくり結論

  • 基本方針: まずは const を使い、後で値を入れ替えたい必要があるときだけ let にする。
  • 再代入: const は再代入不可、let は再代入可。
  • スコープ: どちらもブロックスコープ(波括弧 {} の中限定)。
  • 巻き上げ: どちらも「宣言前は使えない(TDZ)」。

再代入の可否(もっとも大事な違い)

const a = 1;
// a = 2; // エラー:const は再代入不可

let b = 1;
b = 2;     // OK:let は再代入できる
JavaScript
  • Label: const は「この識別子が指すものを変えない」宣言。安心して読めるコードになる。
  • Label: let は「後で値が変わる」前提の一時変数やカウンタに使う。

オブジェクト/配列と const(中身は変更可能)

const user = { name: "Taro" };
user.name = "Hanako";   // OK:プロパティ変更は可能
// user = { name: "Ken" }; // エラー:別オブジェクトの再代入は不可

const xs = [1, 2];
xs.push(3);             // OK:配列の中身変更は可能
// xs = [9];            // エラー:再代入は不可
JavaScript
  • Label: const は「変数が別の値を指すこと」を禁止するだけ。参照先のオブジェクトの中身変更は許される。
  • Label: 参照先も不変にしたいなら Object.freeze() を使う。

スコープ(どこから見えるか)

if (true) {
  let x = 10;
  const y = 20;
  console.log(x, y); // 10 20
}
// console.log(x, y); // エラー:ブロックの外では見えない
JavaScript
  • Label: let/const は「ブロックスコープ」。for 文や if などの波括弧内だけ有効。
  • Label: 古い var は「関数スコープ」で混乱しやすいので基本使わない。

巻き上げと TDZ(宣言前は使えない)

// console.log(a); // ReferenceError(TDZ:宣言前に使えない)
let a = 1;

// console.log(b); // ReferenceError(const も同様)
const b = 2;
JavaScript
  • Label: let/const は宣言より前の時間帯(Temporal Dead Zone)で参照するとエラー。
  • Label: 「上で使って、下で宣言する」書き方は避ける。上から順に宣言して使う。

for ループでの使い分け

for (let i = 0; i < 3; i++) {
  console.log(i); // 0,1,2(i は再代入されるので let)
}

const list = [1, 2, 3];
for (const v of list) {
  console.log(v); // 各反復で v は新しい束縛。再代入しないなら const が読みやすい
}
JavaScript
  • Label: カウンタ i のように値が変わるなら let。
  • Label: 反復ごとの「読み取り専用の一時変数」には const。

いつどちらを使うか(実践ルール)

  • Label: 変更しない設定値・関数・定数的な値 → const
  • Label: 後で代入が必要になるバッファ・一時変数・カウンタ → let
  • Label: 関数の戻り値を受けてそのまま使うだけ → const にして意図を明確に
const TAX_RATE = 0.1;     // 変わらない定数
let total = 0;            // 加算していくので変わる
total += 100 * (1 + TAX_RATE);
JavaScript

よくあるつまずき

  • Label: const でオブジェクトを宣言しても「中身は変えられる」ことを忘れやすい。参照を変えられないだけ。
  • Label: 宣言より前で使うと ReferenceError。必ず「宣言 → 使用」の順に書く。
  • Label: var と混在させない。スコープや巻き上げが違い、予期せぬバグを招く。
  • Label: なんでも let にしない。原則 const にして、変更が必要なときだけ let にする。

ミニ練習

  • 問1: 変わらないAPIのURLを const、変更される合計値を let で宣言せよ。
const API_URL = "https://example.com/api";
let total = 0;
total += 500;
console.log(API_URL, total);
JavaScript
  • 問2: const で配列を宣言し、要素を追加してから表示せよ(再代入はしない)。
const arr = [1];
arr.push(2);
console.log(arr); // [1, 2]
JavaScript
  • 問3: for ループのカウンタに let、反復要素に const を使え。
const list = ["a", "b", "c"];
for (let i = 0; i < list.length; i++) {
  const item = list[i];
  console.log(i, item);
}
JavaScript
  • 問4: 宣言前に変数を使うと何が起こるか確認せよ(コメントの行を外すとエラー)。
// console.log(msg); // ReferenceError
let msg = "hello";
console.log(msg);
JavaScript

まとめ

  • const は再代入不可、let は再代入可。どちらもブロックスコープで宣言前は使えない。
  • 原則 const を使い、値が変化する必要があるときだけ let。
  • const でもオブジェクトの「中身」は変えられる(参照の再代入は不可)。
  • 読みやすさと安全性を高めるために、意図(変わる/変わらない)を宣言で表現する。
タイトルとURLをコピーしました