JavaScript | 関係演算子(比較演算子)

JavaScript JavaScript
スポンサーリンク

ここでは JavaScript の関係(比較)演算子を中心に、よくあるハマりどころ(文字列比較や型変換、===== の違い、null / undefined の挙動、NaN)まで丁寧に扱います。コード例はそのままブラウザのコンソールや Node.js で動きます。

1. まず基本 — 「比較演算子」は何をするか

比較演算子は 左と右の値を比較して true または false を返す演算子です。よく使う場面:if 文、ループ、並べ替え条件など。

主要な演算子(一覧):

  • < (より小さい)
  • <= (以下)
  • > (より大きい)
  • >= (以上)
  • == (等しい(型変換あり))
  • ===(厳密に等しい(型も値も同じ))
  • != (等しくない(型変換あり))
  • !==(厳密に等しくない)

2. 数値の比較

数値同士はそのまま大小を比べます。簡単!

console.log(5 < 10);   // true
console.log(7 >= 7);   // true
console.log(-2 > -5);  // true
JavaScript

例:点数判定

let score = 78;
if (score >= 60) {
  console.log('合格!');
} else {
  console.log('不合格');
}
JavaScript

3. 文字列の比較 — 「文字の並び(辞書順)」で比べられる

文字列同士を < > で比べると、「アルファベット順(正確には Unicode のコードポイント順)」で比較されます。数値の大小ではありません。だから直感と違うことがあります。

console.log('apple' < 'banana'); // true  (a < b)
console.log('A' < 'a');          // true  ('A' のコードポイント 65 < 'a' の 97)
console.log('120' > '3');        // false — 文字列として先頭文字 '1' と '3' を比べるから
JavaScript

注意点の例:

console.log('5' < '12'); // false — '5' の先頭文字 '5' が '1' より大きいから
JavaScript

→ 文字列比較は桁数や数値の大小ではなく「先頭から順に文字を1つずつ比較」することを覚えておいてください。

4. 数値と文字列が混ざると — 自動で型変換される

数値文字列 を比較するとき、JavaScript は 文字列を数値に変換して比較します(ただし文字列が数値に変換できないと NaN になり比較は false になります)。

console.log('120' > 3);    // true  ('120' → 120 に変換される)
console.log('abc' > 0);    // false ('abc' → NaN、NaN と比較すると false)
JavaScript

5. null / undefined / 真偽値の比較 の振る舞い(初心者がハマる所)

  • true は数値の 1false0 とみなされる場合があります。
console.log(true > false); // true (1 > 0)
JavaScript
  • null は数値変換で 0 になります(ただし比較のルールが微妙なので注意。== と === の違いも関わる)。
console.log(null >= 0); // true  (null → 0 とみなして 0 >= 0)
console.log(null > 0);  // false (null → 0 とみなして 0 > 0 は false)
JavaScript
  • undefined は数値に変換できず NaN になるため、ほとんどの比較は false になります:
console.log(undefined > 0);  // false
console.log(undefined == null); // true (== は特殊扱いで true)
JavaScript

6. NaN(Not-a-Number)は比較で常に特殊

NaN と何かを比較しても false になります(自分自身とも等しくない):

console.log(NaN > 0); // false
console.log(NaN == NaN); // false
// 判定は isNaN() か Number.isNaN() を使う
console.log(Number.isNaN(NaN)); // true
JavaScript

7. == と === の違い(超重要)

  • ==型変換をしたうえで比較(ゆるい比較)。
  • ===型も値も完全一致(厳密比較)。こちらを常用するのがベター。

例:

console.log(1 == '1');   // true  ('1' → 1 に変換)
console.log(1 === '1');  // false (型が違う)
console.log(null == undefined); // true (== は特別扱い)
console.log(null === undefined); // false
JavaScript

推奨:バグを減らすために === / !== を基本に使う。

8. オブジェクトや配列を比較するとき

オブジェクト(配列含む)は 参照(メモリ位置)を比較します。内容が同じでも別のオブジェクトは ===false です。

const a = [1,2,3];
const b = [1,2,3];
const c = a;
console.log(a === b); // false (中身は同じでも別インスタンス)
console.log(a === c); // true  (同じオブジェクトを参照)
JavaScript

9. よくあるハマり(まとめ)

  • 文字列 '120''3' の比較は「文字列としての順番」を見る → '120' > '3'false
  • 数値と文字列が混在する場合、文字列が数値に変換される(変換できなければ NaN)。
  • nullundefined の挙動は特別(null == undefined は true、でも null >= 0 は true)。
  • NaN は比較に弱い(NaN == NaN は false)。
  • オブジェクトは参照比較 → 内容比較したければ自分で要素を比較するか JSON 文字列化などを検討。

10. 実践例題(解説付き)

以下をブラウザのコンソールで試して、結果と理由を確認してみてください。すべての答えは下にまとめます。

例題 A:

console.log('5' < '12');
JavaScript

例題 B:

console.log('100' > 7);
JavaScript

例題 C:

console.log(null > 0);
console.log(null >= 0);
JavaScript

例題 D:

console.log(undefined == null);
console.log(undefined === null);
JavaScript

例題 E:

console.log(0 == false);
console.log(0 === false);
JavaScript

例題 F:

console.log([1,2] == '1,2');
JavaScript

例題 G:

console.log(NaN == NaN);
console.log(Number.isNaN(NaN));
JavaScript

解答と理由(短く)

  • A: false — 文字列比較で先頭文字 ‘5’ と ‘1’ を比べる → ‘5’ の方が大きいから '5' < '12' は false。
  • B: true — ‘100’ は数値 100 に変換されてから比較 → 100 > 7 は true。
  • C: null > 0false(0 > 0 ではない)。null >= 0true(0 >= 0)。(null は比較の文脈で 0 と扱われることがある)
  • D: undefined == nulltrue(== は特別扱い)。undefined === nullfalse(型が異なる)。
  • E: 0 == falsetrue(型変換で 0 == 0)。0 === falsefalse(型が違う)。
  • F: true — 配列は文字列化される場面があって [1,2]'1,2' となり等しいと判断される(ただしコーディングでこれに依存しない方が良い)。
  • G: NaN == NaNfalseNumber.isNaN(NaN)true

11. ベストプラクティス(初心者向け)

  • === / !== を使う:型の違いで起きるバグを減らせます。
  • 値の型を揃えてから比較するNumber()String() を使って明示的に変換すると安全。
if (Number(input) > 0) { ... }
JavaScript
  • 文字列を数字として比較したいときは明示的に数値に変換する(Number() / parseInt() / parseFloat())。
  • nullundefined は別物。両方をまとめて扱いたいなら == を使うより value == null(=value === null || value === undefined)を明示的にチェックするか、最初に value == null の意味を理解して使う。
  • NaN の判定は Number.isNaN() を使う(isNaN() はルーズで意図せぬ真偽になることがある)。

12. さらに練習問題(自力でトライ)

  1. console.log('2' + 2 > '22'); はどうなる?(ヒント:+ の振る舞いに注意)
  2. console.log([] == false); は?
  3. オブジェクト a = {x:1}b = {x:1} を比較したらどうなる?a == b は?
タイトルとURLをコピーしました