8-1. 変数・データ型・演算子
このセクションで学ぶこと
Section titled “このセクションで学ぶこと”- JavaScriptの変数宣言(
let・const)の使い分けを理解する - プリミティブ型とオブジェクト型の違いを知る
- テンプレートリテラルや便利な文字列メソッドを使えるようになる
- 暗黙の型変換の罠と
===による厳密比較を理解する - 論理演算子・Null合体演算子・オプショナルチェーンを使いこなす
JavaScriptはブラウザとNode.js(サーバーサイド)の両方で動く言語だ。この章では第4章で学んだプログラミングの基礎概念をJavaScriptの具体的な文法で押さえる。
変数宣言:let と const
Section titled “変数宣言:let と const”JavaScriptには変数宣言のキーワードが3つあるが、現代のコードでは let と const だけを使う。
const name = "Alice"; // 再代入不可(定数)let count = 0; // 再代入可能count = 1; // OK
name = "Bob"; // エラー:Assignment to constant variable
varは古い書き方で、スコープのルールが直感に反するため使わない。
const を優先する理由
Section titled “const を優先する理由”const で宣言しておくと「この変数は変わらない」という意図が明確になり、バグを防げる。再代入が必要になったときだけ let に変える習慣をつけよう。
// 良い例const MAX_RETRY = 3;const apiUrl = "https://api.example.com";
// 後から変更が必要なものは letlet retryCount = 0;retryCount++;JavaScriptの型は大きく プリミティブ型 と オブジェクト型 に分かれる。
プリミティブ型(値そのものを保持)┌─────────────┬──────────────────────┬─────────────────────┐│ 型 │ 例 │ 説明 │├─────────────┼──────────────────────┼─────────────────────┤│ number │ 42, 3.14, NaN │ 整数・小数を統一した型││ string │ "hello", 'world' │ 文字列 ││ boolean │ true, false │ 真偽値 ││ undefined │ undefined │ 値が未設定 ││ null │ null │ 意図的な「なし」 ││ bigint │ 9007199254740993n │ 巨大整数 ││ symbol │ Symbol("id") │ ユニークな識別子 │└─────────────┴──────────────────────┴─────────────────────┘
オブジェクト型(参照を保持) object / array / function などtypeof で型を調べる
Section titled “typeof で型を調べる”typeof 42 // "number"typeof "hello" // "string"typeof true // "boolean"typeof undefined // "undefined"typeof null // "object" ← 有名なバグ。歴史的経緯で直されていないtypeof [] // "object"typeof {} // "object"typeof function(){} // "function"undefined と null の違い
Section titled “undefined と null の違い”let a; // 宣言したが値を入れていない → undefinedlet b = null; // 意図的に「空」を表したい → null
// 実務では// undefined: 「まだ設定されていない」// null: 「存在しないことが確定している」数値の罠:NaN と浮動小数点
Section titled “数値の罠:NaN と浮動小数点”// NaN(Not a Number):数値演算が失敗したときparseInt("abc") // NaNNaN === NaN // false ← NaNは自分自身と等しくないisNaN(NaN) // true ← isNaN() で判定する
// 浮動小数点の精度問題0.1 + 0.2 // 0.300000000000000040.1 + 0.2 === 0.3 // false// 対策:整数に変換して計算するか、toFixed()を使う(0.1 + 0.2).toFixed(1) === "0.3" // true(文字列として比較)テンプレートリテラル
Section titled “テンプレートリテラル”バッククォートを使うと、変数の埋め込みと複数行が簡単に書ける。
const user = "Alice";const score = 95;
// 古い書き方(+で連結)const msg1 = "こんにちは、" + user + "!スコアは" + score + "点です。";
// テンプレートリテラル(推奨)const msg2 = `こんにちは、${user}!スコアは${score}点です。`;
// 複数行もそのまま書けるconst html = ` <div> <p>${user}</p> </div>`;便利な文字列メソッド
Section titled “便利な文字列メソッド”const s = " Hello, World! ";
s.trim() // "Hello, World!" 前後の空白を除去s.toLowerCase() // " hello, world! "s.includes("World") // trues.startsWith(" He") // trues.replace("World", "JS") // " Hello, JS! "s.split(", ") // [" Hello", "World! "]"abc".repeat(3) // "abcabcabc""5".padStart(3, "0") // "005" ← ゼロ埋めに便利JavaScriptは型変換が暗黙的に行われる(型強制)ため、意図しない動作が起きやすい。
// 暗黙の型変換の例"5" + 3 // "53" (+は文字列連結が優先)"5" - 3 // 2 (-は数値演算)"5" * "3" // 15true + 1 // 2false + 1 // 1null + 1 // 1undefined + 1 // NaN
// 明示的な変換(推奨)Number("42") // 42String(42) // "42"Boolean(0) // falseBoolean("") // falseBoolean(null) // falseBoolean(undefined) // falseBoolean([]) // true ← 空配列でもtrueになる点に注意等値比較:== vs ===
Section titled “等値比較:== vs ===”// == は型変換してから比較(使わない)0 == "0" // true0 == false // true"" == false // true
// === は型も含めて厳密比較(常にこちらを使う)0 === "0" // false0 === false // falsenull === undefined // falseルール:等値比較は必ず
===を使う。==は使わない。
10 + 3 // 1310 - 3 // 710 * 3 // 3010 / 3 // 3.3333...(JavaScriptに整数除算はない)10 % 3 // 1 (余り)2 ** 10 // 1024(べき乗)
let x = 5;x++; // 5 → 6(後置インクリメント)++x; // 6 → 7(前置インクリメント)x += 10; // 17論理演算子と短絡評価
Section titled “論理演算子と短絡評価”true && false // falsetrue || false // true!true // false
// 短絡評価:左辺が決まれば右辺を評価しないfalse && console.log("実行されない")true || console.log("実行されない")
// 実用的な使い方const user = null;const name = user && user.name; // user がnullなら name もnull(エラーにならない)
const config = null;const host = config || "localhost"; // configがfalsyなら"localhost"
// Null合体演算子 ??(null/undefinedのときだけデフォルト値を使う)const port = null ?? 3000; // 3000const zero = 0 ?? 3000; // 0 (0はnullではないので置き換えない)const empty = 0 || 3000; // 3000 ←||は0をfalsyと判定するので注意オプショナルチェーン ?.
Section titled “オプショナルチェーン ?.”const user = null;
// 従来の書き方const city = user && user.address && user.address.city;
// オプショナルチェーン(nullやundefinedなら undefined を返す)const city2 = user?.address?.city; // undefined(エラーにならない)
// メソッド呼び出しにも使えるuser?.getName() // userがnullでもエラーにならない| 項目 | ポイント |
|---|---|
| 変数宣言 | const 優先、再代入が必要なら let。var は使わない |
| 型 | 7種類のプリミティブ型。typeof null === "object" に注意 |
| 文字列 | テンプレートリテラル(バッククォート)を使う |
| 等値比較 | 常に ===。== は使わない |
| 論理演算子 | ?? と ?. で null/undefined を安全に扱う |