JavaScript:変数とデータ型(let / const)
1学習の目的
- let と const を使い分けて値に名前を付けられるようになる。同じ数字を何度も書く必要がなくなり、修正が1箇所で済むようになる。
- 数値・文字列・真偽値の違いと、JavaScript特有の型変換を理解する。「なぜか計算結果がおかしい」の原因を自力で見抜けるようになる。
2基礎解説
| やりたいこと | 書き方 | 意味 |
|---|---|---|
| 変わらない値 | const price = 180; | 再代入できない。基本はこちら |
| 後で変える値 | let total = 0; | 再代入できる |
| 型を調べる | typeof price | "number" |
| 文字に埋め込む | `${name}さん` | テンプレートリテラル |
- まず const で書き、再代入が必要になったら let に変える。これが現代のJavaScriptの標準的な進め方。var は古い書き方なので使わない。
- 基本の型は number(数値)/string(文字列)/boolean(true・false)。整数と小数の区別はなく、どちらも number。
- "5" + 3 は "53" になる。+ は文字列があると連結を優先する。一方 "5" - 3 は 2。この非対称がJS最大の罠。
- 文字列を数値にするには Number("42")。変換できない文字は NaN(Not a Number)になる。
- バッククォート ` で囲むと ${ } の中に変数や式を埋め込める。+ で継ぎ足すより圧倒的に読みやすいので常にこちらを使う。
現場使用例:税率や上限値などの設定値を const で定義、合計を let で積み上げ、フォームから来た文字列を Number で数値化、テンプレートリテラルで表示文を組み立て。
const price = 180; // 変わらない値
const qty = 3;
let total = 0; // これから変わる値
total = price * qty;
console.log(total); // 540
console.log(typeof price); // number
console.log(typeof "こんにちは"); // string
console.log(typeof true); // boolean
// テンプレートリテラル(バッククォートで囲む)
const name = "田中";
console.log(`${name}さん:${total}円`); // 田中さん:540円
// 型の落とし穴
console.log("5" + 3); // 53 ← 連結される
console.log("5" - 3); // 2 ← こちらは計算される
console.log(Number("5") + 3);// 8 ← 数値に変換してから足す
3基本ドリル(10問)
出力 == 180
const 名前 = 値; と書き、console.log(名前) で出す。
const price = 180; console.log(price);
変数は値に付けた名札。以降は 180 と書く代わりに price と書けるので、値を変えるときは宣言の1行だけ直せばよくなる。
A. 2に変わる B. TypeErrorになる C. 無視される D. 1のまま警告が出る 選択★☆☆無料
解答 == B
const は「定数」の意味。
B
Assignment to constant variable. というエラーでその場で止まる。うっかり書き換える事故を防げるのが const の価値。
出力 == 500
2回目は let を付けずに total = 500; と書く。
let total = 0; total = 500; console.log(total);
再代入するときにlet を付け直さないのがポイント。付けると「二重宣言」のエラーになる。
____ tax = 0.1; console.log(tax);
出力 == 0.1
「定数」を意味する5文字のキーワード。
const
税率のような途中で変わってはいけない値は const で守る。まず const、必要なら let——この順で考える。
A. "int" B. "number" C. "integer" D. "digit" 選択★☆☆無料
解答 == B
JavaScriptに整数専用の型はない。
B
42 も 3.14 もどちらも number。他の言語のような int / float の区別がないのがJavaScriptの特徴。
出力 == 田中さんの点数は82点です
バッククォート ` で囲み、変数は ${name} のように埋め込む。
const name = "田中";
const score = 82;
console.log(`${name}さんの点数は${score}点です`);
バッククォートはキーボードの Shift + @(日本語配列)で入力できる。引用符 " とは別の記号なので注意。
const text = "42"; console.log(____(text) + 8);
出力 == 50
文字列を数値に変換する組み込み関数。先頭は大文字。
Number
変換しないと "428" という文字列になってしまう。入力された値は常に文字列なので、計算前の変換は必須の作業。
A. 8 B. 53 C. "53" D. エラー 選択★★☆無料
解答 == B
+ は文字列があるとどう振る舞うか。
B
数値の3が文字列に変換されて連結される。表示上は引用符が付かないので B。ちなみに "5" - 3 は 2 になる——- には連結の意味がないためで、この非対称さがバグの温床になる。
出力 == 180円 × 3 = 540円
${ } の中には計算式も書ける。${price * qty} のように。
const price = 180;
const qty = 3;
console.log(`${price}円 × ${qty} = ${price * qty}円`);
${ } の中には式が書けるので、計算結果を別の変数に入れなくてよい。JS01で + を継ぎ足して書いた明細が、ここで一気に読みやすくなる。
出力 == true / boolean
typeof で型が取れる。テンプレートリテラルで2つを並べる。
const isMember = true;
console.log(`${isMember} / ${typeof isMember}`);
true・false の2値だけを持つのが boolean。「〜かどうか」を表す変数は is や has で始めるのが慣習で、読む人に型が伝わる。
4実践シナリオ(5問)
出力2行が完全一致
小計を const subtotal = ... で1回だけ計算し、税込ではその subtotal を使い回す。
const notePrice = 180;
const noteQty = 3;
const penPrice = 120;
const penQty = 5;
const taxRate = 0.1;
const subtotal = notePrice * noteQty + penPrice * penQty;
const total = Math.round(subtotal * (1 + taxRate));
console.log(`小計 ${subtotal}円`);
console.log(`税込 ${total}円`);
JS01では「180 * 3 + 120 * 5」を2回書いていたが、subtotal という名前を付けたことで1回で済んだ。単価を変えたければ宣言の1行を直すだけ。これが変数の本当の価値。
「変換なし:255」「変換あり:30」の形式。 コーディング★★☆無料
出力2行が完全一致
変換なしは inputAge + 5、変換ありは Number(inputAge) + 5。
const inputAge = "25";
console.log(`変換なし:${inputAge + 5}`);
console.log(`変換あり:${Number(inputAge) + 5}`);
255 という数字が出た瞬間、型変換を忘れたと分かる。フォームやAPIから来た値は必ず文字列なので、計算の前に Number() を通すのが鉄則。
出力2行が完全一致
数値に変換できない文字列は NaN になる。そのまま出力すればよい。
const text1 = "42";
const text2 = "abc";
console.log(`${text1} → ${Number(text1)}`);
console.log(`${text2} → ${Number(text2)}`);
NaN は Not a Number(数値ではない)の意味。NaN を含む計算はすべて NaN になるので、合計が NaN になったら「どこかで変換に失敗している」と疑う。
出力4行が完全一致
total += 値 と書くと total = total + 値 と同じ意味になる。const では再代入できないので let を使う。
let total = 0;
total += 120;
console.log(`+120 → 合計${total}円`);
total += 340;
console.log(`+340 → 合計${total}円`);
total += 250;
console.log(`+250 → 合計${total}円`);
console.log(`最終合計:${total}円`);
値が変化していくものは let——これが const との使い分けの基準。+= は積み上げ処理の定番で、次章以降のループで必ず使う。
「佐藤さん(28歳)」「会員:true」「保有ポイント:1,250pt」
※ポイントは3桁区切りにすること。 コーディング★★★無料
出力3行が完全一致
3桁区切りは points.toLocaleString() で作れる。
const name = "佐藤";
const age = 28;
const isMember = true;
const points = 1250;
console.log(`${name}さん(${age}歳)`);
console.log(`会員:${isMember}`);
console.log(`保有ポイント:${points.toLocaleString()}pt`);
toLocaleString() は数値を「1,250」のように読みやすい桁区切りにする。金額やポイントの表示では必須で、自分でカンマを入れる処理を書く必要はない。
5仕上げ課題
顧客名:佐藤太郎 / 会員:true
商品:ワイヤレスイヤホン 単価 12800円 × 2個
会員割引:10% / 消費税:10%
入力された配送番号(文字列):"5" → 配送日数として使う
仕様:
① 変わらない値は const、計算途中で変わる値は let を使うこと
② 金額はすべて計算させ、Math.round で整数に丸めること
③ 金額の表示は3桁区切り(toLocaleString())
④ 配送番号は文字列なので、数値に変換してから計算に使うこと
⑤ すべての出力にテンプレートリテラルを使うこと
出力仕様(7行):
=== 注文確認 ===
佐藤太郎 さま(会員:true)
ワイヤレスイヤホン 12,800円 × 2
---
小計:25,600円
会員割引後:23,040円
お届け:10日後(税込 25,344円)
出力7行が完全一致
小計 → 割引後 → 税込 の順に let で積み上げるか、それぞれ const で段階的に作る。配送日数は Number("5") * 2 = 10。税込は割引後の金額に 1.1 を掛けて Math.round。
const customer = "佐藤太郎";
const isMember = true;
const itemName = "ワイヤレスイヤホン";
const price = 12800;
const qty = 2;
const memberRate = 0.1;
const taxRate = 0.1;
const inputDays = "5";
const subtotal = price * qty;
const discounted = Math.round(subtotal * (1 - memberRate));
const total = Math.round(discounted * (1 + taxRate));
const deliveryDays = Number(inputDays) * 2;
console.log("=== 注文確認 ===");
console.log(`${customer} さま(会員:${isMember})`);
console.log(`${itemName} ${price.toLocaleString()}円 × ${qty}`);
console.log("---");
console.log(`小計:${subtotal.toLocaleString()}円`);
console.log(`会員割引後:${discounted.toLocaleString()}円`);
console.log(`お届け:${deliveryDays}日後(税込 ${total.toLocaleString()}円)`);
数値の一切をコードに直接書かず、すべて変数から組み立てられたのがこの課題の到達点。単価を変えたければ price の1行、税率を変えたければ taxRate の1行を直すだけで、出力全体が正しく追随する。
そして④の配送番号が重要だ。"5" * 2 は偶然 10 になるが、"5" + 2 なら "52" になる。文字列のまま計算に混ぜると、動く場合と壊れる場合がある——だから最初に Number() で変換しておく。この習慣が、後々の原因不明のバグを未然に防ぐ。
次章では演算子と比較を扱う。== と === の違いという、JavaScriptで最も有名な落とし穴に踏み込む。