TL

変数とデータ型

変数は「値に付ける名札」。値には数値・文字列・真偽値などの“型”があり、プリミティブと参照型で代入やコピーの挙動が変わる。

基礎変数データ型基礎最終更新: 2026-06-04
TL;DR要点だけ先に
  • 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

「再代入しない変数」を const にしておくと、“ここは途中で変わらない”が一目で分かり、うっかり上書きを防げます。変化が必要なものだけ let にするのが現代的な作法です。

主なデータ型

どの言語にもだいたい共通する「基本の型」を押さえましょう。

表すもの
数値(number / int・float)数。整数と小数を区別する言語も42, 3.14, -7
文字列(string)文字の並び。クォートで囲む"hello", "こんにちは"
真偽値(boolean)true / false の2値。条件分岐の核true, false
null「意図的に空」を表す値見つからなかった結果 など
undefined「未定義・まだ値がない」状態宣言だけして未代入の変数

nullundefined は紛らわしい代表格です。ざっくり言うと undefined は「システムがまだ入れていない」、null は「人が意図的に空にした」。多くの言語には片方しかありませんが、JavaScript は両方持つので特に注意します。

let a;            // 宣言だけ → undefined(自動)
let b = null;     // 明示的に「空」を入れた → null

typeof 42;        // "number"
typeof "hi";      // "string"
typeof true;      // "boolean"
数値の落とし穴:0.1 + 0.2

多くの言語の小数は内部が2進数の浮動小数点で、0.1 + 0.20.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 まで変わるのは、ab同じ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 が固定するのは「名札の貼り替え(再代入)」だけで、中身の可変性とは無関係です。const arr = [1,2] でも arr.push(3)通ります(中身は可変)。再代入 arr = [] だけが禁止。「変数の不変」と「値の不変」を混同しないことが大切です。

静的型付けと動的型付け

最後に、型を「いつチェックするか」という言語ごとの方針に軽く触れます。

観点静的型付け動的型付け
代表例Java, Go, TypeScriptPython, JavaScript, Ruby
型を決める時コンパイル時(実行前)実行時(動かしながら)
変数の型原則ずっと同じ型後から別の型も入れられる
長所実行前にミスを検知しやすい短く書け、試作が速い
// 動的型付け(JS):同じ変数に別の型を入れられる
let v = 10;     // number
v = "ten";      // string ← エラーにならない

型の仕組みをもう一段深く知りたい場合は、型システム の記事へ。条件分岐で真偽値をどう使うかは 制御フロー で扱います。

まとめ

  • 変数は「値に付ける名札」。= は等値ではなく代入
  • データ型は値の種類と扱い方を決める。null(意図的な空)と undefined(未定義)は別物。
  • プリミティブは値をコピー、参照型は実体への矢印をコピー。ここが共有バグの最大の原因。
  • const/イミュータブルは似て非なるもの。前者は再代入禁止、後者は中身まで不変。

プログラミング Article

変数とデータ型を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

変数

比較で見る軸

難易度: basic / カテゴリ: プログラミング / タグ数: 3

導入後に効く点

データ型は値の種類と扱い方を決める。数値/文字列/真偽値/null・undefined が基本。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
basic
カテゴリ
プログラミング
タグ数
3

判断チェックリスト

  • 自社の用途が「変数 / データ型」に近いか確認する。
  • 強みである「変数は値そのものではなく、値に付けた“名札(参照)”。代入は名札の貼り替え。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

変数データ型基礎変数データ型基礎
参考: 公式情報