なにが違うのか(結論)
=== は「厳密等価」。値だけでなく型も同じときに true。== は「緩い等価」。比較前に型変換(自動)を行い、見かけ上同じなら true。
初心者は基本的に === を使い、必要なときだけ自分で型をそろえてから比較するのが安全です。
1 === 1; // true
1 === "1"; // false(型が違う)
1 == 1; // true
1 == "1"; // true("1" が数値 1 に自動変換)
JavaScriptどう型変換されるのか(== の癖)
== は両辺の型が違うとき、片方をもう片方に近い型へ変換してから比較します。そのため、直感に反する結果が出ることがあります。
false == 0; // true(false → 0 に)
"" == 0; // true(空文字 → 0 に)
" " == 0; // true(空白文字列 → 0 に)
"01" == 1; // true("01" → 1 に)
null == undefined; // true(特別扱い)
// しかし:
[] == 0; // true(配列 → "" → 0 に)
[] == ""; // true(配列 → "" に)
[1] == 1; // true("1" → 1 に)
JavaScript同じ比較を === で行うと、型が違う限り false になります。
false === 0; // false
"" === 0; // false
[] === 0; // false
[1] === 1; // false
JavaScript代表的なケース別の比較結果
数値と文字列
数値として比べたいなら、先に自分で数値化してから ===。
"10" == 10; // true(型変換あり)
Number("10") === 10; // true(明示的に変換して比較)
JavaScript真偽値との比較
== は真偽値を数値へ変換するため誤判定の原因になります。条件式では直接真偽値を使うか、数値に明示変換します。
true == 1; // true
false == 0; // true
Boolean(1) === true; // true(明示)
JavaScriptnull と undefined
== では特別扱いで同一視されます。どちらでもよい存在チェックには使えますが、具体的な判定は === を使います。
null == undefined; // true
null === undefined; // false
const v = undefined;
v == null; // true(null か undefined かのざっくり判定)
v === null; // false(厳密)
v === undefined; // true
JavaScriptNaN の例外
NaN は自分自身とも等しくありません。== でも === でも等しくないので、専用の判定を使います。
NaN == NaN; // false
NaN === NaN; // false
Number.isNaN(NaN); // true(正しい判定)
JavaScriptオブジェクト・配列(参照の比較)
=== でも == でも「同じ参照か」を比べます。見た目が同じでも別インスタンスなら false。
const a = { x: 1 };
const b = { x: 1 };
const c = a;
a === b; // false(中身が同じでも別物)
a === c; // true(同じ参照)
JavaScript実用的な指針(どう使い分けるか)
基本は常に === を使う。型が違うなら、比較前に自分で揃える(Number, String, Boolean などで明示変換)。== が許されるのは「null と undefined をまとめて未設定として扱いたい」など、挙動が十分理解できていて意図が明確なときだけに限定します。
// 推奨:厳密比較 + 明示変換
const s = "42";
if (Number(s) === 42) {
// 数値 42 と等しいときの処理
}
// 例外的に:未設定チェックなら == を使うことも
const value = getMaybe(); // null か undefined かもしれない
if (value == null) {
// 未設定の処理(null / undefined のどちらでも)
}
JavaScript例題で確認する
例題1:ユーザー入力の数値比較(安全版)
function isAdult(ageStr) {
const age = Number(ageStr);
if (Number.isNaN(age)) return false;
return age >= 18; // ここは数値比較
}
console.log(isAdult("18")); // true
console.log(isAdult("18歳")); // false(数値化できない)
JavaScript例題2:YES/NO の厳密比較(大小文字を無視)
function isYes(answer) {
return String(answer).toLowerCase() === "yes";
}
console.log(isYes("YES")); // true
console.log(isYes("yes ")); // false(空白を許すなら trim を追加)
JavaScript例題3:未設定チェック
function isUnset(v) {
return v == null; // null または undefined をまとめて判定
}
console.log(isUnset(null)); // true
console.log(isUnset(undefined)); // true
console.log(isUnset(0)); // false
console.log(isUnset("")); // false
JavaScriptまとめ
=== は型変換なしの厳密比較、== は型変換ありの緩い比較。直感に反する一致を避けるため、原則 === を使い、必要なら事前に型を明示的にそろえる。特例として「null と undefined を同一視したい」場面では == を意図的に使う。これだけで比較まわりのバグは大幅に減らせます。
