変数と定数
JavaScript では、データを保存するために変数と定数を使用します。
変数(let)
変数は、値を格納するためのコンテナで、その値は後から変更できます。
// 変数の宣言と初期化
let message = "Hello, World!";
console.log(message); // Hello, World!
// 変数の値を変更
message = "こんにちは、世界!";
console.log(message); // こんにちは、世界!
let キーワードを使うと、あとから値を変更できる変数を作れます。変数名は自由につけられますが、わかりやすい名前をつけることが大切です。
定数(const)
定数は、一度定義すると別の値に置き換えられないコンテナです。
// 定数の宣言と初期化
const PI = 3.14159;
console.log(PI); // 3.14159
// 定数の値を変更しようとするとエラーになる
// PI = 3.14; // TypeError: Assignment to constant variable.
const で宣言した変数は、あとから別の値に置き換えられません。変わらない値(定数)を扱うときに使います。慣習として、変わらない設定値の定数名は大文字で書くことが多いです。
const は「再代入できない」だけで「不変」ではない
const が禁止するのは「変数そのものへの再代入」だけです。オブジェクトや配列の 中身 は変更できます。
const user = { name: "田中" };
user.name = "佐藤"; // ✅ プロパティの変更は OK
console.log(user.name); // 佐藤
// user = {}; // ❌ 再代入はエラー (TypeError)
const numbers = [1, 2, 3];
numbers.push(4); // ✅ 配列への追加も OK
console.log(numbers); // [1, 2, 3, 4]
「箱を別の箱に取り替えることはできないが、箱の中身は入れ替えられる」とイメージすれば分かりやすいです。中身まで変更させたくない場合は Object.freeze() を使う方法もあります。
var(古い変数宣言)
古いコードでは var キーワードを見かけることがありますが、最新の JavaScript では let と const を使うことが推奨されています。
// var による変数宣言(非推奨)
var oldVariable = "古い書き方";
// 問題点: 再宣言が可能
var oldVariable = "再宣言してしまった"; // エラーにならない
var の問題点: 関数スコープ
let / const がブロック {} ごとに有効範囲(スコープ)を持つのに対し、var はブロックを無視して関数全体に漏れ出します。
// var はブロック {} を無視して外からも見えてしまう
if (true) {
var leaked = "ブロックの外でも見える";
}
console.log(leaked); // ブロックの外でも見える (漏れている)
// let はブロックスコープ。ブロックの外からは見えない
if (true) {
let blockScoped = "ブロックの中だけ";
}
// console.log(blockScoped); // ❌ ReferenceError
var は宣言が関数の先頭に巻き上げられ(ホイスティング)、宣言前にアクセスしても undefined になります。一方 let / const は宣言前にアクセスすると TDZ(Temporal Dead Zone) により ReferenceError になります。
console.log(a); // undefined (var はエラーにならない)
var a = 1;
console.log(b); // ❌ ReferenceError (let は TDZ でエラー)
let b = 2;
宣言前アクセスがすぐエラーになる let / const の方が、バグを早期に発見できます。
まとめ
| 宣言 | 再代入 | スコープ | 宣言前アクセス |
|---|---|---|---|
const | ❌ 不可 | ブロック | TDZ(ReferenceError) |
let | ✅ 可 | ブロック | TDZ(ReferenceError) |
var | ✅ 可 | 関数 | undefined(非推奨) |
基本は const を使い、再代入が必要なときだけ let を使う、var は使わない、と覚えておけば十分です。
次に読む
- データ型 — 変数に入れる「値」にはどんな種類があるか