変数
データに名前をつけて保存し、プログラム中で参照・変更できる仕組み
変数とは
変数 (Variable) は、データに名前をつけて保存する仕組みである。プログラムの中で値を記憶し、後から参照したり変更したりできる。
宣言と代入
変数を使うには、まず宣言 (名前の登録) を行い、次に代入 (値の格納) を行う。多くの言語では宣言と代入を同時に行える。
// 宣言と代入を同時に行う
const name = "Alice";
let age = 15;
// 代入のみ (let で宣言済みの変数)
age = 16;
const と let の使い分け
TypeScript / JavaScript では const と let の 2 種類がある。
| キーワード | 再代入 | 用途 |
|---|---|---|
| const | 不可 | 変更しない値 |
| let | 可 | 後から変更する値 |
原則として const を使い、再代入が必要な場合だけ let を使う。var は歴史的な理由で残っているが、スコープの挙動が直感的でないため使わない。
型と変数
静的型付け言語では、変数に格納できるデータの種類 (型) が決まっている。
const count: number = 42; // 数値のみ
const message: string = "hello"; // 文字列のみ
const active: boolean = true; // 真偽値のみ
TypeScript は型推論が働くため、明示的な型注釈を省略しても型が決まる。
const count = 42; // number と推論される
スコープ
変数には有効範囲 (スコープ) がある。関数の中で宣言した変数は、その関数の外からは参照できない。
function greet() {
const msg = "hello"; // この関数の中だけで有効
console.log(msg);
}
// console.log(msg); // ❌ エラー: msg は関数の外では参照できない
ブロック ({}) の中で let や const で宣言した変数も、そのブロックの外からは参照できない。
命名規則
変数名はコードの読みやすさに直結する。以下の慣習が広く使われている。
| 規則 | 例 | 用途 |
|---|---|---|
| camelCase | userName |
変数、関数 |
| PascalCase | UserProfile |
クラス、型 |
| UPPER_SNAKE | MAX_RETRY |
定数 |
名前は「何が入っているか」がわかるようにつける。x や tmp のような曖昧な名前は避け、userAge や itemCount のように具体的にする。
ミュータブルとイミュータブル
変数の値を後から変更できるかどうかは、プログラムの安全性に大きく影響する。
// イミュータブル (変更不可)
const items = Object.freeze([1, 2, 3]);
// ミュータブル (変更可)
const list = [1, 2, 3];
list.push(4); // OK
イミュータブルな変数を多用すると、意図しない値の変更を防げるため、バグが減る。
他言語との比較
| 言語 | 不変 | 可変 |
|---|---|---|
| TypeScript | const |
let |
| Rust | デフォルト不変 | let mut |
| Python | 慣習のみ | 全て可変 |
| Java | final |
通常の宣言 |
Rust はデフォルトで不変であり、明示的に mut をつけない限り再代入できない。この設計は安全性を重視している。
よくある間違い
よくある間違いを以下にまとめる。
| 間違い | 問題 | 対策 |
|---|---|---|
| 未初期化で参照 | undefined やエラー | 宣言時に初期値を設定 |
| グローバル変数の乱用 | 依存関係が不明瞭 | スコープを狭く保つ |
| 意味のない名前 | 可読性の低下 | 具体的な名前をつける |
| const なのに中身を変更 | オブジェクトの中身は変更可能 | Object.freeze を使う |
変数の設計と命名の考え方は関連書籍に詳しい。
この記事は役に立ちましたか?