B バイナンス · 世界最大級の暗号資産取引所バイナンス 登録 → AD OKX OKX · 世界の大手暗号資産取引所OKX 登録 → AD
💻 コーディングの基礎 · 第2講 / 10

値・変数・データ型 — 名札を付けて値を扱う

プログラムは、値を受け取り、変えて、出す作業の連続です。値には種類(データ型)があり、変数はその値に付ける名札です。種類の違う値を混ぜたときに起こる自動変換が、初心者のミスの大きな部分を占めます。

⏱ 約20分 ✍️ 確認問題 5問 🧪 コード実習 4題 更新 2026-10-09
🎯 この講義の学習目標
  • 数値・文字列・真偽値・null・undefinedを区別し、typeofで確かめられる
  • letとconstの違いを知り、適切に選んで変数を作れる
  • 算術演算子と文字列の連結を使い、"1" + 2のような自動の型変換の結果を予測できる
  • 0.1 + 0.2の誤差が生じる理由を説明し、お金の計算でそれを避ける方法を使える

1.値とデータ型 — 値にも種類がある

第1講ではconsole.logで数や文字を出力してみました。このようにプログラムが扱う一つひとつのデータを値といい、値の種類をデータ型といいます。人は「3」という文字と3という数を文脈で見分けますが、コンピューターは値ごとに種類を付けておき、その種類によってできることを決めます。数は足したり掛けたりでき、文字はつなげたり長さを数えたりできます。

JavaScriptでいちばんよく使う基本のデータ型は五つです。数値(number)は整数と小数を区別せず、すべて一つの種類として扱います。文字列(string)は引用符で囲んだ文字の並びです。真偽値(boolean)は真(true)と偽(false)の二つだけの値で、第3講の条件分岐で中心的な役割を果たします。undefinedは「まだ値が決まっていない」、nullは「値がないことをわざと示している」という意味です。このほかに、とても大きな整数のためのbigint、一意な目印であるsymbolもありますが、このコースではほとんど使いません。

値の種類はtypeof演算子で確かめられます。結果は種類の名前が入った文字列です。一つだけ古い例外があり、typeof nullは"null"ではなく"object"になります。JavaScriptの初期の設計の名残で、今さら変えると既存のWebページが壊れてしまうため、そのまま残っています。そのため、ある値がnullかどうかを確かめるときは、typeofではなく第3講で学ぶ=== nullの比較を使います。

引用符で囲んだ"42"は数値ではなく文字列です
console.log(typeof 42, typeof 3.14);
console.log(typeof "やあ", typeof "42");
console.log(typeof true, typeof undefined);
console.log(typeof null); // 古い例外
出力
number number
string string
boolean undefined
object
よく使う基本のデータ型
データ型例`typeof`の結果使いどころ
数値42, 3.14, -7"number"個数・金額・点数などの計算
文字列"ゆうき", '42'"string"名前・文章・電話番号のように計算しない文字
真偽値true, false"boolean"はい/いいえ、条件の判断
undefinedundefined"undefined"まだ値を入れていない状態
nullnull"object"(例外)値がないことをわざと示す

2.変数 — `let`と`const`で名札を付ける

同じ値を何度も使ったり、計算結果をしばらく取っておいたりするには、値に名前を付ける必要があります。この名前を変数といいます。変数は箱というより、値に付ける名札に近いものです。const price = 1200;と書くと、1200という値にpriceという名札が付き、それ以降はpriceと書くだけで1200を指します。ここでの=は数学の「等しい」ではなく、「右の値を左の名前に入れる」という意味です。

変数の作り方は二つあります。constは一度決めたら別の値を入れ直せない変数で、letはあとで別の値に変えられる変数です。基本はconstで書き、値が変わる必要がある場合(合計を積み上げるときや個数を数えるときなど)だけletを使うのがよい習慣です。こうすると「この値は変わらない」ということがコードに表れて読む人が安心でき、うっかり上書きするとすぐにエラーで知らせてくれます。古いコードで見かけるvarは規則がわかりにくい昔のやり方なので、新しいコードでは使いません。

名前は、何が入っているかがわかるように付けます。aやx2より、priceやtotalCountのほうがずっと読みやすくなります。JavaScriptでは、複数の単語をつなげるとき、2つ目の単語から頭文字を大文字にする書き方(totalPrice)がよく使われます。名前は数字で始められず、空白も入れられず、letやifのような予約語も使えません。大文字と小文字を区別するので、priceとPriceは別の変数です。

変わらない値はconst、変わる値はlet
const price = 1200;
const count = 3;
const total = price * count;
console.log("合計:", total);

let visits = 0;
visits = visits + 1;
visits = visits + 1;
console.log("訪問数:", visits);
出力
合計: 3600
訪問数: 2
constの変数に入れ直すと、3行目でエラーになって止まります
const rate = 0.05;
console.log("利率:", rate);
rate = 0.07;
console.log("変更後の利率:", rate);
出力
利率: 0.05
TypeError: Assignment to constant variable.
値を入れずに作った変数はundefinedです
let memo;
console.log(memo);
memo = "買い物";
console.log(memo);
出力
undefined
買い物
visits = visits + 1は数学として見ると成り立ちませんが、コードでは「今のvisitsの値に1を足した結果を、もう一度visitsに入れる」という意味です。短くvisits += 1とも書きます。第4講の繰り返しで、この「積み上げ」のパターンを何度も使います。

3.演算子 — 計算して、つなげる

数値には四則演算の+、-、*、/のほかに、余りを求める%と、べき乗の**があります。%は思ったより頻繁に使います。ある数を2で割った余りが0なら偶数ですし、分単位の時間を60で割った商と余りから「何時間何分」を作れます。計算の順序は数学と同じで、掛け算・割り算が足し算・引き算より先です。迷うときは、かっこを付けて意図をはっきりさせるのがよいでしょう。

割り算の結果が整数でなくても、JavaScriptは小数で答えます。7 / 2は3.5です。商だけが必要ならMath.floorで小数点以下を切り捨て、四捨五入にはMath.round、切り上げにはMath.ceilを使います。0で割るとエラーになる代わりにInfinity(無限大)が出て、数値にできない計算をすると「数ではない」という意味のNaNが出ます。NaNは名前に反してtypeofが"number"になる特別な数値だということも覚えておきましょう。

+は文字列にも使えます。二つの文字列を+で足すと、つながります。"こん" + "にちは"は"こんにちは"になります。文字列の中に変数の値を入れるときは、バッククォート(日本語キーボードではシフトキーを押しながら@キー)で囲み、その中にドル記号と波かっこで変数を入れる「テンプレートリテラル」が便利です。見た目は下のコード例で確かめてください。文字列は第7講で詳しく扱います。

%は余り、**はべき乗
console.log(7 + 2, 7 - 2, 7 * 2, 7 / 2);
console.log(7 % 2, 2 ** 10);
console.log(Math.floor(7 / 2), Math.round(2.5));
console.log(Math.ceil(2.1), 1 / 0);
出力
9 5 14 3.5
1 1024
3 3
3 Infinity
商と余りで時間を変換し、二つの方法で文字列を作る
const minutes = 135;
const h = Math.floor(minutes / 60);
const m = minutes % 60;
console.log(h + "時間" + m + "分");
console.log(`${h}時間${m}分`);
出力
2時間15分
2時間15分

4.型変換の落とし穴 — `"1" + 2`はなぜ`"12"`なのか

JavaScriptは、種類の違う値を混ぜて計算すると、エラーを出す代わりに片方を自動で変えて計算します。これを暗黙の型変換といいます。便利なこともありますが、初心者のミスの大きな原因です。いちばん有名な例が"1" + 2です。+の片側が文字列だと、JavaScriptは「連結」と解釈して数値の2を文字列の"2"に変え、結果は"12"になります。

ところが"5" - 2は3です。-、*、/は文字列には使えない演算なので、今度は文字列を数値に変えて計算するからです。同じ文字列と数値なのに、演算子によって結果が文字列になったり数値になったりするのですから、混乱するのも無理はありません。この問題は実際によく起こります。入力欄、テキストファイル、CSVから読み込んだ値は、数に見えてもたいてい文字列なので、そのまま足すと合計ではなく、文字がずらずらとつながった結果になります(第9講)。

解決策は、計算する前に自分で数値に変えることです。これを明示的な型変換といいます。Number("12")は数値の12になり、Number("12ウォン")のように数として読めない文字が混ざるとNaNになります。逆に数値を文字列に変えるときはString(12)を使います。結果がおかしいときは、まずtypeofで値の種類を出力してみる習慣をつけましょう。第8講のデバッグも、このように「値が思ったとおりの種類か」を確かめるところから始まります。

+の片側が文字列だと連結になります
console.log("1" + 2);
console.log(1 + 2 + "3");
console.log("5" - 2, "5" * "2");
console.log(typeof ("1" + 2));
出力
12
33
3 10
string
読み込んだ値はNumberで変えてから計算します
const a = "3000";
const b = "4500";
console.log(a + b);
console.log(Number(a) + Number(b));
console.log(Number("12ウォン"), Number(""));
console.log(String(12) + String(3));
出力
30004500
7500
NaN 0
123
  • 足したのに結果が妙に長くなったら、文字列どうしがつながったのではないかと疑う
  • 外から読み込んだ値(入力・ファイル・表)は、計算の前にNumberで変える
  • Numberの結果がNaNなら、数でない文字(単位やカンマなど)が混ざっている
  • 空文字列""はNumberで変えると0になることに注意する — 空欄を0と数えるのか、別に扱うのかを決めておく必要がある

5.`0.1 + 0.2`は`0.3`ではない

練習場で0.1 + 0.2を出力してみると、0.30000000000000004と出ます。JavaScriptが計算を間違えているわけではありません。コンピューターは数を2進法で保存しますが、10進法の0.1は2進法では終わりなく続く小数なので、決まった枠に収めるときにほんの少し切り捨てられます。10進法で1/3を0.333…と最後まで書けないのと同じ理屈です。この方式(浮動小数点数)は、ほとんどすべてのプログラミング言語が同じ標準に従っているので、他の言語でも同じことが起こります。

誤差はとても小さいので、たいていの計算では問題になりませんが、二つの場面では注意が必要です。一つ目は、等しいかどうかを比べるときです。0.1 + 0.2 === 0.3はfalseです。二つ目は、お金のように1単位も間違えてはいけない計算です。小数を何度も足したり掛けたりしているうちに、小さな誤差が積み重なって表示に出てしまうことがあります。

よく使われる解決策は三つです。ウォンやセントのようないちばん小さな単位の整数に直して計算すれば、整数どうしの足し算・引き算・掛け算をしているあいだは誤差が生じません(とても大きな数でない限り)。割り算が入る場合は、最後に一度だけ丸めます。画面に表示するときだけtoFixedで桁数をそろえるか、Math.roundで四捨五入します。比べるときは、二つの値の差がごく小さいかどうかを見る方法を使います。練習場の採点機も、小数の結果はごく小さな差なら等しいとみなします。ただし、toFixedの結果は数値ではなく文字列であることを忘れないでください。

toFixedは文字列を返します
console.log(0.1 + 0.2);
console.log(0.1 + 0.2 === 0.3);
console.log((0.1 + 0.2).toFixed(2));
console.log(typeof (0.1 + 0.2).toFixed(2));
出力
0.30000000000000004
false
0.30
string
いちばん小さな単位の整数で計算すれば誤差はありません
// 1.10ドル + 2.20ドルをセント(整数)で計算
const cents = 110 + 220;
console.log(cents / 100);
console.log(1.1 + 2.2);
出力
3.3
3.3000000000000003
例題仮の例です。1,200ウォンの品物を3個買って、10%の割引を受けました。小数の誤差なしに、ウォン単位の支払い金額を求めるにはどう計算すればよいでしょうか。
const total = 1200 * 3;
const pay = Math.round(total * 90 / 100);
console.log("支払い金額:", pay);
出力
支払い金額: 3240
  1. ステップ1 合計は整数の計算なので安全です:1200 * 3 = 3600。
  2. ステップ2 割引率を小数(0.9)で掛けずに、整数の掛け算と割り算に置き換えます:3600 * 90 / 100 = 3240。
  3. ステップ3 割り切れないこともあるので、ウォン単位でMath.round(または方針によってはMath.floor)をかけます。
  4. 検算:3600の10%は360なので、3600 − 360 = 3240ウォンで一致します。
答え3,240ウォン(整数で計算してから、ウォン単位で四捨五入)

6.`null`と`undefined` — 「空」の二つの顔

JavaScriptには「値がない」ことを表す値が二つあります。undefinedはたいてい、JavaScriptが自分で入れる値です。変数を作って値を入れなかったとき、オブジェクトにない属性を読んだとき(第6講)、関数が何も返さないとき(第5講)に出てきます。nullは人がわざと入れる値で、「ここが空であることはわかっている」という印です。たとえば、まだ入力されていない電話番号の欄にnullを入れておく、といった使い方をします。

どちらも計算に使うとおかしな結果になります。nullは数値の計算では0のように扱われてnull + 1は1になり、undefinedは数値に変えられないのでundefined + 1はNaNになります。こうした結果はエラーメッセージなしに静かに広がっていくので、なおさら危険です。合計がNaNになったら、計算のどこかにundefinedが混ざっているという合図だと読み取りましょう。

もっと大きな問題は、空の値から何かを取り出そうとしたときです。nullやundefinedの属性を読もうとすると、TypeErrorで止まります。AIが書いたコードでもよく見かけるエラーで、「データが空のとき」を処理していないことが原因です。第3講で、こうしたケースを条件分岐であらかじめふるい落とす方法を学びます。

空の値の属性を読むとエラーで止まります(文言はブラウザによって少し違います)
console.log(null + 1, undefined + 1);
let phone = null;
console.log("電話番号:", phone);
console.log(phone.length);
出力
1 NaN
電話番号: null
TypeError: Cannot read properties of null (reading 'length')

📌 要点まとめ

  • 基本のデータ型は数値・文字列・真偽値・undefined・nullで、typeofで確かめる(typeof nullは例外で"object")
  • 基本はconst、値が変わる必要があるときだけletを使い、varは使わない
  • +は片側が文字列だと連結になる — 読み込んだ値はNumberで変えてから計算する
  • 0.1 + 0.2の誤差は2進法で保存するためで、お金は整数の単位で計算し、表示するときに丸める
  • NaNやTypeErrorが見えたら、計算の途中にundefined・nullが混ざっていないか疑う

✍️ 確認問題

まず自分で解いてから「解答と解説」を開いてください。

Q1. console.log("1" + 2 + 3);の出力はどれでしょうか。

⭕ 正解です

❌ もう一度考えてみましょう

解答と解説
正解 ② 123

左から計算します。"1" + 2は文字列の"12"になり、"12" + 3も連結なので"123"です。逆に1 + 2 + "3"は先に3になってから連結されて"33"です。

Q2. 次のうち、constで作るのにふさわしくない変数はどれでしょうか。

⭕ 正解です

❌ もう一度考えてみましょう

解答と解説
正解 ② 繰り返しながら足し続けていく合計

積み上げる合計は値が変わり続けるので、letで作る必要があります。constに値を入れ直すとTypeErrorになります。

Q3. typeof nullの結果はどれでしょうか。

⭕ 正解です

❌ もう一度考えてみましょう

解答と解説
正解 ③ "object"

初期の設計の名残で"object"になります。そのため、nullかどうかを確かめるときは=== nullで比べます。

Q4. 価格の文字列"3000"と"4500"を足して7500を得るコードとして正しいものはどれでしょうか。

⭕ 正解です

❌ もう一度考えてみましょう

解答と解説
正解 ③ Number("3000") + Number("4500")

それぞれを先に数値に変えてから足す必要があります。二つ目の選択肢は、連結して"30004500"を作ってから数値に変えるので、30004500になります。

Q5. 0.1 + 0.2 === 0.3がfalseになる理由を一文で説明してください。

解答と解説
解答例 コンピューターは数を2進法で保存するが、0.1と0.2は2進法で正確に表せないため、ごく小さな誤差が生じるから

結果は0.30000000000000004です。お金の計算はウォンやセントのような整数の単位で行い、比べるときは差が十分に小さいかを見ます。

🧪 コード実習

関数の中の空欄を埋める練習です。関数は第5講で詳しく学ぶので、今は「かっこの中の名前で値を受け取り、returnの後ろの値を返す」ということだけわかれば十分です。

コードはこのブラウザの中の隔離された場所でだけ実行され、サーバーには送られません。ネットワークには接続できず、2秒を超えると止まります。書き換えたコードはこのブラウザにだけ保存されます。Ctrl+Enter(⌘+Enter)で実行、Tabキーは空白2つ(Escの後のTabで次へ移動)。

JavaScriptが無効なので実行はできませんが、問題・最初のコード・自動チェックの内容・解答例はそのまま読めます。

1合計を求める

totalPrice(price, count)は、価格priceと個数count(どちらも数値)を受け取って合計を返します。個数が0なら0です。

自動チェック
  • totalPrice(1200, 3)期待値 3600
  • totalPrice(2500, 1)期待値 2500
  • totalPrice(990, 0)期待値 0
  • totalPrice(0, 5)期待値 0
💡 ヒント

掛け算は*です。const total = price * count;

解答例を見る
function totalPrice(price, count) {
  const total = price * count;
  return total;
}

2文字列の数を足す

addStrings(a, b)は、数が書かれた文字列を二つ(例:"3000"、"4500")受け取り、二つの数の和を数値で返します。そのままa + bとすると連結されてしまうので注意してください。

自動チェック
  • addStrings("3000", "4500")期待値 7500
  • addStrings("1", "2")期待値 3
  • addStrings("0", "0")期待値 0
  • addStrings("-5", "2.5")期待値 -2.5
💡 ヒント

Number(a)は文字列aを数値に変えます。

解答例を見る
function addStrings(a, b) {
  return Number(a) + Number(b);
}

3データ型の名前を教える

typeName(v)は、値vのデータ型の名前を文字列で返します。typeofと同じですが、nullのときだけは"object"ではなく"null"を返してください。

自動チェック
  • typeName(42)期待値 "number"
  • typeName("42")期待値 "string"
  • typeName(true)期待値 "boolean"
  • typeName(null)期待値 "null"
  • typeName("")期待値 "string"
💡 ヒント

if (v === null) { return "null"; }をreturn typeof v;の前に入れます。ifは第3講で詳しく学びます。

解答例を見る
function typeName(v) {
  if (v === null) {
    return "null";
  }
  return typeof v;
}

4割り勘の金額

splitBill(total, people)は、総額totalウォンをpeople人で分けて払うときの、一人分の金額を返します。足りなくならないように、10ウォン単位で切り上げてください。例:10000ウォンを3人なら3333.33…ウォン → 3340ウォン。

自動チェック
  • splitBill(10000, 3)期待値 3340
  • splitBill(9000, 3)期待値 3000
  • splitBill(25010, 2)期待値 12510
  • splitBill(0, 4)期待値 0
  • splitBill(1, 1)期待値 10
💡 ヒント

10で割ってからMath.ceilで切り上げ、もう一度10を掛けます。すでに10ウォン単位ならそのまま残ります。

解答例を見る
function splitBill(total, people) {
  const each = total / people;
  return Math.ceil(each / 10) * 10;
}

🤖 AIにはこう聞いてみましょう

コピーして [ ] の部分を自分の状況に書き換えて使います。答えはそのまま信じず、本文と比べて確かめましょう。

計算結果がおかしいとき

下のJavaScriptのコードの結果が[期待した値]ではなく[実際の値]になります。各変数のデータ型(`typeof`)が行ごとにどうなるかを表で示し、型変換が起きている箇所を指摘してください。直したコードは最後に見せてください。コード:[コードを貼り付け]

型変換の感覚を練習したいとき

`"1" + 2`、`"5" - 2`、`null + 1`のようなJavaScriptの型変換の問題を8問作ってください。答えは伏せておき、私が予想した値を送ったら、合っているかどうかとその理由を教えてください。最後の2問は、実際の仕事(表から読み込んだ金額を足す)のような問題にしてください。

お金の計算のコードを見直すとき

次のJavaScriptの金額計算のコードに、小数の誤差や丸めの問題が起きそうな箇所がないか見直してください。ウォン単位の整数で計算する方法に変えるとどうなるかを示し、四捨五入と切り捨てのどちらを使ったかをコメントで明記してください。コード:[コードを貼り付け]

🧰 関連ツール

この講義で扱ったJSON・正規表現・テキストを、その場で確かめたり整えたりできるツールです。本物の個人情報やパスワードは貼り付けないでください。

参考
  • MDN Web Docs — JavaScriptガイドの文法とデータ型、式と演算子
  • MDN Web Docs — typeof、Number、浮動小数点数に関するリファレンス
  • IEEE 754 浮動小数点数の標準に関する一般的な説明

学習目標をすべて達成できたら完了を押しましょう。

💻 コーディングの基礎

  1. 1プログラムとは — 仕事を順番・条件・繰り返しに分ける考え方
  2. 2値・変数・データ型 — 名札を付けて値を扱う
  3. 3条件分岐 — 状況によって違う道を進む
  4. 4繰り返し — 同じことを正確に何度もさせる
  5. 5関数 — 名前を付けた小さな機械に分ける
  6. 6配列とオブジェクト — データを入れて扱う
  7. 7文字列とテキスト処理 — 文字を切り出し、探し、置き換える
  8. 8デバッグとエラーの読み方 — 赤い文字を手がかりに変える
  9. 9かんたんな自動化の例 — 表の計算とテキストの整理をコードで
  10. 10AIが書いたコードを読んで検証する — テスト・セキュリティ・ライセンス・個人情報
📚 あわせて読みたい
📊表計算の作業を人工知能で手伝わせる、数式は必ず検証→ 💻人工知能のコーディング支援の使い方と危険、セキュリティとライセンス→ 💬外国語の会話練習相手としてAIを使う→ ⚙️業務自動化のアイデア探し、AIに任せる仕事の選び方→
← AI時代の基礎学力講座