JavaScript | 基礎構文:比較・論理 – == と === の違い

JavaScript JavaScript
スポンサーリンク

なにが違うのか(結論)

=== は「厳密等価」。値だけでなく型も同じときに 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(明示)
JavaScript

null と undefined

== では特別扱いで同一視されます。どちらでもよい存在チェックには使えますが、具体的な判定は === を使います。

null == undefined;   // true
null === undefined;  // false

const v = undefined;
v == null;           // true(null か undefined かのざっくり判定)
v === null;          // false(厳密)
v === undefined;     // true
JavaScript

NaN の例外

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 を同一視したい」場面では == を意図的に使う。これだけで比較まわりのバグは大幅に減らせます。

タイトルとURLをコピーしました