ここでは 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('不合格');
}
JavaScript3. 文字列の比較 — 「文字の並び(辞書順)」で比べられる
文字列同士を < > で比べると、「アルファベット順(正確には 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)
JavaScript5. null / undefined / 真偽値の比較 の振る舞い(初心者がハマる所)
trueは数値の1、falseは0とみなされる場合があります。
console.log(true > false); // true (1 > 0)
JavaScriptnullは数値変換で0になります(ただし比較のルールが微妙なので注意。== と === の違いも関わる)。
console.log(null >= 0); // true (null → 0 とみなして 0 >= 0)
console.log(null > 0); // false (null → 0 とみなして 0 > 0 は false)
JavaScriptundefinedは数値に変換できずNaNになるため、ほとんどの比較はfalseになります:
console.log(undefined > 0); // false
console.log(undefined == null); // true (== は特殊扱いで true)
JavaScript6. 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
JavaScript7. == と === の違い(超重要)
==は 型変換をしたうえで比較(ゆるい比較)。===は 型も値も完全一致(厳密比較)。こちらを常用するのがベター。
例:
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 (同じオブジェクトを参照)
JavaScript9. よくあるハマり(まとめ)
- 文字列
'120'と'3'の比較は「文字列としての順番」を見る →'120' > '3'は false。 - 数値と文字列が混在する場合、文字列が数値に変換される(変換できなければ
NaN)。 nullとundefinedの挙動は特別(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 > 0はfalse(0 > 0 ではない)。null >= 0はtrue(0 >= 0)。(nullは比較の文脈で 0 と扱われることがある) - D:
undefined == nullはtrue(== は特別扱い)。undefined === nullはfalse(型が異なる)。 - E:
0 == falseはtrue(型変換で 0 == 0)。0 === falseはfalse(型が違う)。 - F:
true— 配列は文字列化される場面があって[1,2]→'1,2'となり等しいと判断される(ただしコーディングでこれに依存しない方が良い)。 - G:
NaN == NaNはfalse。Number.isNaN(NaN)はtrue。
11. ベストプラクティス(初心者向け)
===/!==を使う:型の違いで起きるバグを減らせます。- 値の型を揃えてから比較する:
Number()やString()を使って明示的に変換すると安全。
if (Number(input) > 0) { ... }
JavaScript- 文字列を数字として比較したいときは明示的に数値に変換する(
Number()/parseInt()/parseFloat())。 nullとundefinedは別物。両方をまとめて扱いたいなら==を使うよりvalue == null(=value === null || value === undefined)を明示的にチェックするか、最初にvalue == nullの意味を理解して使う。NaNの判定はNumber.isNaN()を使う(isNaN()はルーズで意図せぬ真偽になることがある)。
12. さらに練習問題(自力でトライ)
console.log('2' + 2 > '22');はどうなる?(ヒント:+の振る舞いに注意)console.log([] == false);は?- オブジェクト
a = {x:1}とb = {x:1}を比較したらどうなる?a == bは?
