進捗:
01c/8

null の概念
「何もない」を理解しよう

プログラムの「空っぽ」の状態を安全に扱う方法を学ぼう

nullって何?

null とは、「 何もない 」「 値が存在しない 」ことを表す特別な値です。空の箱とは違い、「箱そのものが存在しない」状態を表します。

❌ 勘違いしやすい例

  • • 数値の 0
  • • 空文字列 ""
  • • false
  • • 空の配列 []

これらは「値がある」状態

⚠️ null と undefined

  • null : 意図的に「空」
  • undefined : 未定義

どちらも「何もない」だが微妙に違う

✅ null の正体

  • • 値が「存在しない」
  • • 意図的な「空」状態
  • • リセット可能な状態

プログラマが明示的に設定

🔍 null と他の値の違い

🏠 現実世界の例

財布の中身

  • 1000円 → 値がある
  • 0円 → 値はあるが金額は0
  • 財布を忘れた → null(何もない)

電話番号

  • 090-1234-5678 → 値がある
  • "" → 空文字(何も入力されていない)
  • null → 電話番号自体が存在しない

友達リスト

  • ["太郎", "花子"] → 友達がいる
  • [] → 友達はいない(リストは存在)
  • null → 友達システム自体が無効

💻 プログラムの例

// ========== 値がある状態 ========== let playerName = "太郎"; // 文字列 let playerScore = 0; // 数値(0だが値はある) let playerItems = []; // 空配列(配列は存在) let isAlive = false; // 真偽値 // ========== null(何もない)状態 ========== let currentWeapon = null; // 武器を持っていない let targetEnemy = null; // ターゲットなし let saveData = null; // セーブデータなし let selectedItem = null; // 何も選択していない // ========== 比較してみる ========== console.log(playerScore === 0); // true(値は0) console.log(currentWeapon === null); // true(何もない) // これらは全て異なる! console.log(0 === null); // false console.log("" === null); // false console.log(false === null); // false console.log([] === null); // false

🎮 ゲームでのnullの活用例

ゲーム開発では、nullを使って「まだ設定されていない」「一時的に無効」「選択されていない」状態を表現します。

// ========== プレイヤーの装備管理 ========== let equippedWeapon: string | null = null; // 武器を装備していない let equippedArmor: string | null = null; // 防具を装備していない let equippedAccessory: string | null = null; // アクセサリーを装備していない // 装備を変更 equippedWeapon = "鋼の剣"; // 武器を装備 equippedArmor = "革の鎧"; // 防具を装備 // アクセサリーは null のまま(装備していない) // ========== バトルシステム ========== let targetEnemy: string | null = null; // ターゲットなし let currentSpell: string | null = null; // 魔法を準備していない let lastAttacker: string | null = null; // まだ誰も攻撃していない // バトル開始 targetEnemy = "ゴブリン"; // 敵をターゲット currentSpell = "ファイアボール"; // 魔法を準備 // バトル終了後 targetEnemy = null; // ターゲット解除 currentSpell = null; // 魔法リセット // ========== UI状態管理 ========== let selectedMenuItem: string | null = null; // メニュー項目が選択されていない let openDialog: string | null = null; // ダイアログが開いていない let hoveredButton: string | null = null; // マウスがボタンの上にない

nullを使う理由

  • • 「未設定」の状態を明確に表現
  • • 無効な値との区別
  • • リセット可能な状態
  • • エラーハンドリングの改善

null使用場面

  • • 装備品の管理
  • • ターゲット選択
  • • UI状態管理
  • • セーブデータの初期化

🛡️ nullチェック(安全な使い方)

⚠️ 危険:nullチェックを忘れると...

nullが入っている変数を、値があると思って使うとエラーが発生します:

let currentWeapon: string | null = null; // 武器なし // 危険な使い方 - エラーが発生! console.log(currentWeapon.length); // Error: Cannot read properties of null console.log(currentWeapon.toUpperCase()); // Error: Cannot read properties of null let weaponPower = currentWeapon + " +10"; // "null +10" という文字列になってしまう

✅ 安全:適切なnullチェック

nullの可能性がある値は、使用前に必ずチェックしましょう:

let currentWeapon: string | null = null; // ========== 方法1: if文でチェック ========== if (currentWeapon !== null) { console.log(`武器: ${currentWeapon}`); console.log(`文字数: ${currentWeapon.length}`); } else { console.log("武器を装備していません"); } // ========== 方法2: 三項演算子 ========== const weaponDisplay = currentWeapon !== null ? currentWeapon : "素手"; console.log(`装備: ${weaponDisplay}`); // ========== 方法3: || 演算子でデフォルト値 ========== const displayWeapon = currentWeapon || "武器なし"; console.log(`表示: ${displayWeapon}`); // ========== 方法4: オプショナルチェーニング(?.) ========== console.log(currentWeapon?.length); // null の場合は undefined を返す console.log(currentWeapon?.toUpperCase()); // エラーにならない

❌ 危険なコード

// nullチェックなし function getWeaponPower(weapon: string | null) { return weapon.length * 10; // null の場合エラー! }

✅ 安全なコード

// 適切なnullチェック function getWeaponPower(weapon: string | null) { if (weapon === null) return 0; return weapon.length * 10; // 安全! }

実践例:インベントリシステム

安全なアイテム管理システム

// ========== プレイヤーの装備状態 ========== interface PlayerEquipment { weapon: string | null; armor: string | null; accessory: string | null; } const playerEquipment: PlayerEquipment = { weapon: null, // 武器なし armor: null, // 防具なし accessory: null // アクセサリーなし }; // ========== 装備の変更(安全な実装) ========== function equipWeapon(weaponName: string): void { playerEquipment.weapon = weaponName; console.log(`${weaponName}を装備しました`); } function unequipWeapon(): void { if (playerEquipment.weapon !== null) { console.log(`${playerEquipment.weapon}を外しました`); playerEquipment.weapon = null; } else { console.log("装備している武器がありません"); } } // ========== 装備情報の表示(nullセーフ) ========== function displayEquipment(): void { console.log("=== 現在の装備 ==="); const weaponName = playerEquipment.weapon || "なし"; const armorName = playerEquipment.armor || "なし"; const accessoryName = playerEquipment.accessory || "なし"; console.log(`武器: ${weaponName}`); console.log(`防具: ${armorName}`); console.log(`アクセサリー: ${accessoryName}`); } // ========== 攻撃力計算(nullチェック込み) ========== function calculateAttackPower(): number { let basePower = 10; // 基本攻撃力 // 武器があれば攻撃力アップ if (playerEquipment.weapon !== null) { const weaponBonus = playerEquipment.weapon.length * 5; // 文字数 × 5 basePower += weaponBonus; } return basePower; } // ========== 使用例 ========== displayEquipment(); // 武器: なし, 防具: なし, アクセサリー: なし console.log(`攻撃力: ${calculateAttackPower()}`); // 攻撃力: 10 equipWeapon("鋼の剣"); // 鋼の剣を装備しました displayEquipment(); // 武器: 鋼の剣, 防具: なし, アクセサリー: なし console.log(`攻撃力: ${calculateAttackPower()}`); // 攻撃力: 25 (10 + 3*5) unequipWeapon(); // 鋼の剣を外しました displayEquipment(); // 武器: なし, 防具: なし, アクセサリー: なし

null の活用

  • • 装備なし状態を表現
  • • 意図的なリセット
  • • 初期状態の管理

安全な実装

  • • 全ての操作でnullチェック
  • • デフォルト値の提供
  • • エラーを防ぐ設計

ユーザー体験

  • • 適切なメッセージ表示
  • • 予期しないエラーなし
  • • 直感的な動作

null の概念まとめ

⚠️ 注意点

  • • null は 0 や "" とは違う
  • • nullチェックを忘れるとエラー
  • • 型注釈で | null を明示
  • • オプショナルチェーニング活用

✅ ベストプラクティス

  • • 使用前に必ずnullチェック
  • • デフォルト値を用意
  • • 意味のあるnull使用
  • • エラーハンドリング実装

nullは 「何もない」状態を安全に扱う ための重要な概念です。適切なnullチェックを行うことで、エラーのない堅牢なプログラムが作れます。

次章からは、いよいよ PhaserJS を使った実際のゲーム開発に取り組みます!