JavaScript | 等価演算子

JavaScript JavaScript
スポンサーリンク

ポイントを押さえつつ、実際に動かして確認できるコード例と「注意したい落とし穴」を交えて進めます。最後に短い確認問題(解答つき)も付けます。


何を比べているの?(ざっくり)

JavaScript では「値が等しいか?」を調べる方法が主に2種類あります。

  • ==(等価演算子)
    型が違えば自動で型変換してから比較する。ちょっと“やさしい”けど予想外の結果が出ることがある。
  • ===(厳密等価演算子)
    型も値も同じかどうかをそのまま比較する。変換しないので予想しやすい。

初心者はまず === を基本に使うと安心です。


仕組み(もう少しだけ深掘り)

===(厳密等価)

  • 型が違えば即 false
  • 型も同じなら、その型ごとのルールで比較(数なら数値比較、文字列なら文字列比較)。
  • 例外:NaN === NaNfalse(特別扱い)。Object.is(NaN, NaN) を使うと true

==(等価) の主な変換ルール(要点)

比較する前に 片方または両方の値が「プリミティブ(数・文字列・真偽値・null・undefined)」でない場合、オブジェクトはプリミティブに変換されるvalueOf() / toString() の結果)。
その他よく出るルールだけ抜粋:

  • null == undefinedtrue(これだけの特別ルール)
  • 数値と文字列 → 文字列を数に変換して比較(例: 10 == '10'true
  • 真偽値(boolean) → 数に変換(true1, false0
  • オブジェクトとプリミティブ → オブジェクトをプリミティブに変換してから比較
    • 例:配列 []'' に、[1]'1' に変換されやすい(配列の toString() の振る舞い)。

等価演算(== と !=)と厳密等価演算(=== と !==)の違い — 超かんたんまとめ

  • === / !==厳密等価):型も値も同じかをチェックする。型が違えばすぐ false
  • == / !=等価(抽象等価)):型が違えば自動で「型変換」してから値を比べる。便利なときもあるが、予期せぬ結果になりやすい。

初心者へのおすすめ:普段は === / !== を使っておけば混乱が減ります。


具体例(コードと出力) — 一つずつ見ていきましょう

数値と文字列

console.log(10 == '10');   // true
console.log(10 === '10');  // false
JavaScript

説明:=='10' を数値 10 に変換して比較する( = true)。=== は型が違うので false


null と undefined

console.log(null == undefined);  // true
console.log(null === undefined); // false
JavaScript

説明:== では nullundefined は特殊に「等しい」と扱われます。型までは一致していないので ===false


ブール値(true/false)が絡む場合

console.log(true == 1);   // true
console.log(true === 1);  // false
JavaScript

説明:==true を数値 1 に変換して比べます(true -> 1)。=== は型が違うので false


空文字列・数値のトリッキー例

console.log('' == 0);     // true
console.log('' === 0);    // false
JavaScript

説明:空文字列 '' が数値に変換されると 0 になるため == では等しい扱いになります。


配列・オブジェクト(参照の比較)

console.log({} === {});        // false
let a = {};
let b = a;
console.log(a === b);          // true

console.log([1] == 1);         // true
console.log([1] === 1);        // false
JavaScript

説明:オブジェクト(配列もオブジェクト)は 「参照」 を比較します。別々に作った {} は中身が同じでも別オブジェクトだから ===false。ただし同じ変数を参照していれば true。配列が比較されるときは、まずプリミティブ(文字列など)に変換されてから比較されることがあります([1]'1' → 数値 1 に変換されて比較されるケースがある)。


NaN(Not-a-Number)の特殊さ

console.log(NaN === NaN);      // false
console.log(Object.is(NaN, NaN)); // true
JavaScript

説明:NaN=== でも == でも自分自身と等しくない(false)扱い。NaN を正しく判定するなら Number.isNaN(value) を使うのが推奨。Object.isNaN を正しく同一視します(ただし Object.is(+0, -0) の扱いは異なる — 後述)。


-0 と +0 の違い(特殊)

console.log(+0 === -0);       // true
console.log(Object.is(+0, -0)); // false
JavaScript

説明:=== では +0-0 は同じと見なされるが、Object.is は区別します(珍しいケースですが知っておくと役立つ)。


等価比較(==)で行われる主な「型変換」のルール(初心者向けに要点)

  • 比較される片方が文字列で片方が数値なら、文字列を数値に変換して比較(例: '10'10)。
  • 比較にブール値が含まれると、ブールは数値に変換される(true -> 1, false -> 0)。
  • オブジェクト(配列も含む)はプリミティブ(文字列や数値)に変換されてから比較される([1]'1')。
  • nullundefined は互いに等しい(null == undefinedtrue)が、他の値とは等しくならない(例:null == 0false)。

注意:上のルールは 概念 だけ抑えておけばOK。細かいケースは複雑なので、慣れないうちは === を使うのが安全です。


よくある「罠」・トラップ(実務でもハマりやすい)

  • 0 == ''true(空文字が 0 に変換される) ⇒ 予期せぬ真偽値を招く。
  • [] == ''true(配列 [] が空文字列に変換される)。
  • [] == ![]true![]false[]'' に変換されて '' == 0 となる) — とてもトリッキー。
  • NaN の比較は特殊:NaN === NaNfalseNumber.isNaN() を使う)。

これらのため、== の使用は要注意。ほとんどのコードベースでは === を標準にしています。


Object.is と Number.isNaN の補足

  • Object.is(x, y)=== とほぼ同じだが、NaNNaN と等しいと判定する点や +0 / -0 を区別する点で違います。
  • Number.isNaN(value) は「その値が NaN であるか」を安全に判定できます(古い isNaN() は文字列などを数値に変換してしまうので注意)。

実践的なルール(初心者向けの推奨)

  1. 基本は === / !== を使う(型チェックが自動で入るため安全)。
  2. == を使うのは「型変換の挙動を理解したうえで、明確な理由があるときだけ」。
  3. NaN を扱う場合は Number.isNaN()、特殊な同値性が必要なら Object.is() を検討する。
  4. オブジェクトや配列の比較は「参照が同じか」を比較する点を意識する(中身が同じでも別オブジェクトなら ===false)。

練習問題

各式の結果を予想してから答えを見てください。

  1. 5 == '5'
  2. 0 == false
  3. '' == false
  4. null == 0
  5. [] == 0
  6. [1,2] == '1,2'
  7. NaN === NaN
  8. {} === {}
  9. let x = {}; let y = x; x === y
  10. Object.is(+0, -0)

解答と簡単な解説

  1. true'5' は数値に変換される。
  2. truefalse -> 0 として比較。
  3. true'' -> 0false -> 0 のため等しい。
  4. falsenull==undefined とだけ等しい(null == 0false)。
  5. true[] -> '' -> 0 になり 0 == 0
  6. true[1,2]'1,2' に変換されるので等しい。
  7. falseNaN は自分自身と等しくない(Number.isNaN() を使う)。
  8. false — 別々に作ったオブジェクトは参照が違うため。
  9. truexy は同じオブジェクトを参照している。
  10. falseObject.is+0-0 を区別する。

まとめ

  • 結論:ほとんどの場合は === / !== を使おう
  • 等価演算子 == は便利だが「JS の型変換ルール」を理解していないとバグの元。
  • NaN+0/-0、オブジェクト参照の比較などの特殊ケースは Object.isNumber.isNaN が役に立つ。
タイトルとURLをコピーしました