変数とデータ型
変数は「値に付ける名札」。値には数値・文字列・真偽値などの“型”があり、プリミティブと参照型で代入やコピーの挙動が変わる。
- 1.変数は値そのものではなく、値に付けた“名札(参照)”。代入は名札の貼り替え。
- 2.データ型は値の種類と扱い方を決める。数値/文字列/真偽値/null・undefined が基本。
- 3.プリミティブは値ごとコピー、参照型は“同じ実体への矢印”をコピー。ここが多くのバグの源。
変数と代入
変数を使う流れは「宣言(名前を用意する)→ 代入(値を結びつける)→ 参照(名前で値を取り出す)」の3つです。
let score; // 宣言:名札を用意(まだ値なし)
score = 10; // 代入:名札を 10 に貼る
score = score + 5; // 参照して計算し、貼り直す → 15
**= は「等しい」ではなく「代入(右を左に入れる)」**です。等しいかの判定は == / === を使います。ここは初学者が必ず一度はつまずく所。
宣言にはいくつかキーワードがあり、言語によりますが「再代入できるか」が大きな違いです。
| 宣言の例 | 再代入 | 用途の目安 |
|---|---|---|
| const(JS) / final(Java) | 不可 | 値を変えない。まずこれを既定に |
| let(JS) / 通常の変数 | 可 | ループ変数など変化する値 |
| var(JS・旧来) | 可 | スコープが特殊。今は基本使わない |
「再代入しない変数」を const にしておくと、“ここは途中で変わらない”が一目で分かり、うっかり上書きを防げます。変化が必要なものだけ let にするのが現代的な作法です。
主なデータ型
どの言語にもだいたい共通する「基本の型」を押さえましょう。
| 型 | 表すもの | 例 |
|---|---|---|
| 数値(number / int・float) | 数。整数と小数を区別する言語も | 42, 3.14, -7 |
| 文字列(string) | 文字の並び。クォートで囲む | "hello", "こんにちは" |
| 真偽値(boolean) | true / false の2値。条件分岐の核 | true, false |
| null | 「意図的に空」を表す値 | 見つからなかった結果 など |
| undefined | 「未定義・まだ値がない」状態 | 宣言だけして未代入の変数 |
null と undefined は紛らわしい代表格です。ざっくり言うと undefined は「システムがまだ入れていない」、null は「人が意図的に空にした」。多くの言語には片方しかありませんが、JavaScript は両方持つので特に注意します。
let a; // 宣言だけ → undefined(自動)
let b = null; // 明示的に「空」を入れた → null
typeof 42; // "number"
typeof "hi"; // "string"
typeof true; // "boolean"
多くの言語の小数は内部が2進数の浮動小数点で、0.1 + 0.2 が 0.3 ではなく 0.30000000000000004 になります。バグではなく仕様。お金の計算では小数をそのまま使わず、整数(最小単位=円・セント)や専用の十進型で扱うのが定石です。
プリミティブと参照型
ここが本記事の山場です。値は大きく2グループに分かれ、代入・コピー・比較の挙動がまるで違います。
- プリミティブ型(数値・文字列・真偽値など)… 値そのものをコピー
- 参照型(配列・オブジェクトなど)… 「実体への矢印(参照)」をコピー
// プリミティブ:値ごとコピーされる(独立)
let x = 1;
let y = x; // y は 1 の“写し”
y = 99;
console.log(x); // 1 ← x は無傷
// 参照型:同じ実体を指す“矢印”がコピーされる
let a = { n: 1 };
let b = a; // b は a と同じオブジェクトを指す
b.n = 99;
console.log(a.n); // 99 ← a も変わって見える!
b を書き換えたのに a まで変わるのは、a と b が同じ1個のオブジェクトを指す2本の矢印だから。箱が2つあるわけではありません。
| 観点 | プリミティブ型 | 参照型 |
|---|---|---|
| 代表例 | 数値・文字列・真偽値 | 配列・オブジェクト・関数 |
| 代入・引数渡し | 値の写しを渡す | 参照(同じ実体)を渡す |
| 片方を変えると | もう片方は無傷 | もう片方にも影響する |
| 等値比較 | 中身が同じなら等しい | 同じ実体かどうかで判定 |
const copy = original でオブジェクトや配列を“コピー”しても、できるのは矢印の複製だけ。一方を変えると他方も壊れます。本当に複製したいなら { ...obj } / [...arr](浅いコピー)や、ネストまで複製する structuredClone(obj)(深いコピー)を使い分けます。
ミュータブルとイミュータブル
参照型の話と地続きなのが、値が後から変えられるかという性質です。
- ミュータブル(mutable / 可変): 中身を後から書き換えられる(多くの言語の配列・オブジェクト)
- イミュータブル(immutable / 不変): 一度作ったら変えられない(JS の文字列、Python のタプルなど)
# 文字列はイミュータブル:元は変わらず、新しい文字列が生まれる
s = "abc"
t = s.upper() # t = "ABC"、s は "abc" のまま
# リストはミュータブル:その場で書き換わる
nums = [1, 2, 3]
nums.append(4) # nums 自体が [1, 2, 3, 4] に
const が固定するのは「名札の貼り替え(再代入)」だけで、中身の可変性とは無関係です。const arr = [1,2] でも arr.push(3) は通ります(中身は可変)。再代入 arr = [] だけが禁止。「変数の不変」と「値の不変」を混同しないことが大切です。
静的型付けと動的型付け
最後に、型を「いつチェックするか」という言語ごとの方針に軽く触れます。
| 観点 | 静的型付け | 動的型付け |
|---|---|---|
| 代表例 | Java, Go, TypeScript | Python, JavaScript, Ruby |
| 型を決める時 | コンパイル時(実行前) | 実行時(動かしながら) |
| 変数の型 | 原則ずっと同じ型 | 後から別の型も入れられる |
| 長所 | 実行前にミスを検知しやすい | 短く書け、試作が速い |
// 動的型付け(JS):同じ変数に別の型を入れられる
let v = 10; // number
v = "ten"; // string ← エラーにならない
型の仕組みをもう一段深く知りたい場合は、型システム の記事へ。条件分岐で真偽値をどう使うかは 制御フロー で扱います。
まとめ
- 変数は「値に付ける名札」。
=は等値ではなく代入。 - データ型は値の種類と扱い方を決める。
null(意図的な空)とundefined(未定義)は別物。 - プリミティブは値をコピー、参照型は実体への矢印をコピー。ここが共有バグの最大の原因。
const/イミュータブルは似て非なるもの。前者は再代入禁止、後者は中身まで不変。
プログラミング Article
変数とデータ型を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
変数
比較で見る軸
難易度: basic / カテゴリ: プログラミング / タグ数: 3
導入後に効く点
データ型は値の種類と扱い方を決める。数値/文字列/真偽値/null・undefined が基本。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- basic
- カテゴリ
- プログラミング
- タグ数
- 3
判断チェックリスト
- 自社の用途が「変数 / データ型」に近いか確認する。
- 強みである「変数は値そのものではなく、値に付けた“名札(参照)”。代入は名札の貼り替え。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。