JavaScriptの変数宣言を学ぶと、let と const と var の違いで迷いやすいです。結論からいうと、いま新しく書くコードでは「基本は const、再代入が必要なときだけ let、var は古いコードを読むための知識」と考えれば大丈夫です。
ただし、3つの違いを曖昧なまま使うと、変数のスコープや再宣言の挙動で混乱しやすくなります。この記事では、let・const・var の違い、使い分け、よくあるつまずきを初心者向けに整理します。

迷ったら、まず const で書けないかを考えるのがいちばん実務的です。
結論:let・const・var の違いはここだけ押さえればOK
| 宣言方法 | スコープ | 再代入 | 再宣言 | 使いどころ |
|---|---|---|---|---|
var | 関数スコープ | できる | できる | 古いコードを読むとき |
let | ブロックスコープ | できる | できない | 値が変わる変数 |
const | ブロックスコープ | できない | できない | 値を固定したいとき |
1. var は古い書き方で、挙動が少し特殊
var は昔からある変数宣言です。いまでも古いJavaScriptコードではよく見かけますが、ブロックスコープを持たないため、初心者が混乱しやすい書き方でもあります。
if (true) {
var message = "varで宣言";
}
console.log(message); // varで宣言
この例では、if 文の中で宣言した message を外でも使えています。これは var が { } のブロックではなく、関数単位で有効になるためです。
さらに var は同じスコープで再宣言もできるので、意図しない上書きが起きやすくなります。
var count = 1; var count = 2; console.log(count); // 2
この柔らかさが便利な場面もありますが、現在の開発ではバグの原因になりやすいため、新しく書くコードではあまり使いません。
2. let は「あとで値が変わる変数」に使う
let はブロックスコープを持つ変数宣言です。つまり、if 文や for 文などの { } の中で宣言すると、その外では使えません。
if (true) {
let total = 10;
console.log(total); // 10
}
// console.log(total); // ReferenceError
また、let は再代入できます。
let score = 0; score = 100; console.log(score); // 100
そのため、カウントアップや入力値の更新など、途中で値が変わる前提の変数に向いています。
3. const は「基本の選択肢」
const も let と同じくブロックスコープです。違いは、再代入できないことです。
const taxRate = 0.1; // taxRate = 0.2; // TypeError
一度決めた値を後から変えたくないときに使うことで、「この値は書き換えないつもりです」という意図がコードから伝わります。
ただし、ここで1つだけ勘違いしやすい点があります。const は「中身が完全に不変」という意味ではありません。再代入できないのは変数そのもので、オブジェクトや配列の中身は変更できます。
const user = {
name: "田中"
};
user.name = "佐藤";
console.log(user.name); // 佐藤
この性質まで知っておくと、const への苦手意識がかなり減ります。
4. どう使い分ければよいのか
実務でも学習でも、使い分けは次のルールでほぼ十分です。
- 基本は
const - あとで値を入れ替えるなら
let varは古いコードを読むときの知識
たとえば、APIのURLや設定値、固定のメッセージなどは const に向いています。ループ回数や状態の更新などは let が自然です。
変数の有効範囲まで含めて理解したい方は、JavaScriptのスコープの記事もあわせて読むと、より整理しやすくなります。さらに、関数の呼び出し方で意味が変わる this の記事 まで読むと、変数と関数まわりの基礎がつながります。
5. よくあるつまずき
宣言前に使おうとしてエラーになる
let と const は、宣言より前で使うとエラーになります。これは不具合ではなく、安全のための仕様です。
// console.log(price); // ReferenceError let price = 500;
const なのに中身を書き換えられる
const は再代入を禁止するだけなので、配列の push やオブジェクトのプロパティ変更はできます。ここで「壊れている」と感じやすいですが、仕様どおりです。
var を使っていて思わぬ場所で値が見えてしまう
古いサンプルコードをそのまま写すと、if 文の外でも値が使えてしまい、なぜ動くのか分からなくなることがあります。そういうときはまず「var だからかもしれない」と疑うと解決しやすいです。
関連して学びたい記事
まとめ
JavaScriptの変数宣言は、最初にきちんと整理しておくと後の学習がかなり楽になります。特にスコープと再代入の違いを押さえておくと、関数やアロー関数、非同期処理を学ぶときにもつまずきにくくなります。
