C
JavaScript/基礎/Lesson 06

型強制変換 — *== の落とし穴*

40分·theory
このチャプター
5/5

型強制変換 — *== の落とし穴*

🎯 このレッスンを読み終えたら

このレッスンを読み終えると、以下の3つを自信を持って扱えるようになります。

  • ✅ 暗黙的変換 (== / + / -) の動作規則
  • ✅ falsy な6つの値 (0 · '' · null · undefined · NaN · false)
  • Object.is / Number.isNaN の正確な動作

学習目標をチェックリストとして手元に置き、すべて答えられるようになったらレッスンを閉じてください。

== vs === — *常に === を使う*

核心を一言で

JavaScript の ==比較の前に型を揃えてしまいます。予期しない結果が頻繁に起きます。常に === を推奨

== の衝撃的な挙動

javascript
console.log("5" == 5);          // true   ← string → number に自動変換
console.log(0 == false);        // true   ← boolean → number に自動変換
console.log("" == false);       // true   ← "" → 0、false → 0 → 結果的に 0 == 0
console.log(null == undefined); // true   ← 特殊ルール: この2つは等しいと規定されている

console.log([] == false);       // true   ← 何でも false と等しい?!
console.log([] == ![]);         // true   ← 🤯 配列がその否定と等しい (JS の有名なジョーク)

最後の行を見てください。配列がその自身の否定と等しい。JS の暗黙的変換が生み出す狂った結果です。

=== — 安全な比較

javascript
"5" === 5         // false (型が異なる)
0 === false       // false
null === undefined // false

5 === 5           // true (値も型も同じ)

===値と型の両方が一致したときだけ true予測可能

ESLint が強制する理由

ほとんどの lint 設定では eqeqeq ルールがデフォルトで有効になっています。新しいコードでは常に === を使いましょう。一度慣れると、== を見るだけで違和感を覚えるようになります。

> 例外: nullundefined の両方をまとめて捕捉したい場合:

javascript
if (x == null) { ... }     // null OR undefined

このパターンのみ一部のコードスタイルで許可されています。それ以外は常に ===

Truthy / Falsy

javascript
// Falsy — false と評価される6つの値
if (false) {}
if (0) {}
if ("") {}
if (null) {}
if (undefined) {}
if (NaN) {}

// 上記6つ以外はすべて Truthy
if ([]) {}       // true!  空の配列も truthy
if ({}) {}       // true!  空のオブジェクトも truthy
if ("0") {}      // true!  文字列 "0" は truthy

if (value)値が存在するかどうかを手軽にチェックできます。ただし、空の配列や "0" といった落とし穴も把握しておく必要があります。

最もよくある落とし穴

1. 入力値の比較:

javascript
const age = prompt("年齢?");    // 文字列を返す
if (age == 18) { ... }         // "18" == 18 → true (危険)
if (age === 18) { ... }        // false (意図と異なる)
// 解決策: Number(age) === 18

2. JSON から受け取った数値:

javascript
// APIレスポンス: { count: 5 }
const { count } = await response.json();
count === 5    // true (ほとんどの場合)

JSON は型を保持するため、通常は安全です。ただし、大きな整数bigint への変換が必要です。

まとめ

  • 常に === を使う。==予期しない結果をもたらす
  • 空の配列や "0"truthy であることを覚えておく
  • 入力値は明示的に変換してから比較する

⚡ 実際に試してみよう — == vs ===

`==` が自動変換によって生み出す衝撃的な結果を、`===` と比較してみてください。
✏️ JS 코드
📟 コンソール出力
▶ 実行ボタンを押してください
⚠️ ブラウザのサンドボックスで実行 — console.log()のみ対応、alert/fetchは不可

🤖 AIへの指示をこう変えてみよう

このレッスンの概念を理解すれば、AIに具体的な指示を出せるようになります。漠然とした「直して」ではなく、語彙を持ったリクエスト — それがトークン節約の出発点です。

  • 「この変数に適切な TypeScript の型アノテーションを追加して」
  • 「=== と == が混在している箇所を === に統一して意図を明確にして」
  • 「このコードの JSON.parse の結果に unknown 型 + 型ガードを追加して」

なぜこれがトークンを削減するのか

概念を知らないままだと、AIの回答を受け取った後でも「それって何ですか?」と再度聞く必要があります。その「再質問」がトークンを消費します。概念を一度習得しておけば、会話が一回で完結します。

次のおすすめ: 関数の基礎
型変換と等価比較 - JavaScript