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

JavaScript JavaScript
スポンサーリンク

== と === の違いを一言でいうと

===== の一番大事な違いは、これだけです。

  • == … 型を「勝手に変換」してから比較する(ゆるい比較)
  • === … 型も値も「そのまま」比べる(厳密な比較)

ここが本当に重要です。
JavaScript では、基本的に「比較は全部 === を使う」と決めてしまってください。
== は“特別な理由があるときだけ” 使うくらいでちょうどいいです。


まずは挙動を見てみる:何が同じで何が違うのか

数値同士・文字列同士では、ほとんど同じ

同じ型同士であれば、===== も結果は同じです。

console.log(5 == 5);       // true
console.log(5 === 5);      // true

console.log("abc" == "abc");   // true
console.log("abc" === "abc");  // true
JavaScript

このあたりは特に問題ありません。
違いが出てくるのは、「型が違うもの同士」を比べたときです。

数値と文字列を比べるときの違い

console.log(5 == "5");   // true
console.log(5 === "5");  // false
JavaScript

== の場合、JavaScript はこうします。

  1. 文字列 "5" を「数値の 5」に変換する
  2. 数値 5 と数値 5 を比べる
  3. 同じなので true

=== の場合は、
「数値型」と「文字列型」で型が違う時点で false です。

ここが重要です。
== は「なんか同じっぽいから同じにしちゃえ」と勝手に型を合わせます。
=== は「型が違うならもう違う」とシンプルに判断します。


== が「危ない」理由:暗黙の型変換が多すぎる

0 / “” / false / null / undefined まわりのカオス

次のコードの結果を、自分で一度予想してみてください。

console.log(0 == false);
console.log("" == 0);
console.log("" == false);
console.log(null == undefined);
console.log("0" == false);
JavaScript

実際の結果はこうなります。

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

「なんでそうなるの?」と感じて当然です。
== には、かなり複雑な「変換ルール」が大量に詰め込まれていて、

  • false → 数値 0
  • ""(空文字) → 数値 0
  • nullundefined → お互いだけ特別に等しい

など、人間の直感とズレた変換 が行われます。

一方、=== を使うとこうです。

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

「型が違うから全部 false」 という、とても分かりやすい結果になります。

ここが重要です。
== は「意外なもの同士を true にしてしまう」危険な演算子です。
=== は「型も違えば false」としてくれるので、
“自分の想像以上のことはしてこない” 安全な演算子だと捉えてください。


=== が「基本形」になる理由

1: バグの原因を減らせる

典型的なバグの例を見てみます。

const input = ""; // ユーザーが何も入力しなかった

if (input == 0) {
  console.log("0 が入力されたとみなす");
}
JavaScript

ユーザーは何も入力していないのに、
input == 0 が true になってしまいます。
理由は、""== で比較されると 0 に変換されてしまうからです。

=== を使えばこのバグは起きません。

if (input === 0) {
  // 絶対に実行されない(型が違うので)
}
JavaScript

2: 型のミスにすぐ気付ける

たとえば API から来た値が「文字列の “1”」だと知らずに、
数値の 1 と比べたとします。

const apiValue = "1";

if (apiValue == 1) {
  // true になってしまう
}
JavaScript

== を使うと、型の違いに気付くチャンスを失います。
=== なら、

if (apiValue === 1) {
  // false →「あ、文字列で来てるんだな」と気付ける
}
JavaScript

というふうに、「型が違うこと」がそのままエラーのサインになります。

ここが重要です。
=== を使うことは、「型の取り扱いミスを早期に発見するためのセーフティーネット」です。
== はミスを隠し、=== はミスを露わにしてくれます。
長期的に見て、どちらがうれしいかは明らかですよね。


「じゃあ == は完全に不要なの?」という疑問について

唯一よく使われるパターン:null と undefined をまとめて判定

nullundefined に限っては、
== に「便利な特別ルール」があります。

const value1 = null;
const value2 = undefined;

console.log(value1 == null); // true
console.log(value2 == null); // true
JavaScript

== null は、「値が null か undefined なら true」という意味になります。

この性質を利用して、

if (value == null) {
  // value が null か undefined のときだけ入ってくる
}
JavaScript

と書くスタイルも、プロの現場ではときどき使われます。

ただし初心者のうちは無理に使わなくていい

同じことは、=== を使っても書けます。

if (value === null || value === undefined) {
  // 同じ意味
}
JavaScript

コードは少し長くなりますが、
意味が完全に明示されていて、読みやすいです。

ここが重要です。
== は、「本当にこの“変換ルールの塊”を使いたいのか?」と自問してから使うべきツールです。
初心者のあいだは、「=== だけ使う」と決めてしまったほうが、頭の中がシンプルに保てます。


実際のコードでの使い分けイメージ

ユーザー入力のチェック

const input = "10"; // フォームから来た文字列

// 悪い例(バグの温床)
if (input == 10) {
  console.log("10 です");
}

// 良い例
if (Number(input) === 10) {
  console.log("10 です");
}
JavaScript

「文字列の "10" を、数値として 10 と比べたい」のであれば、
自分で Number(input) と明示的に数値変換した上で === する のが正しいやり方です。

フラグの判定

const isAdmin = "false"; // ダメなAPIが "false" を返してきたとする

if (isAdmin == false) {
  console.log("管理者ではない(ことにされてしまう)");
}
JavaScript

"false" は文字列ですが、== の変換ルールにより、
ややこしい動きをしてしまいます(== false はかなり危ない)。

=== を使うならこうなります。

if (isAdmin === false) {
  // 絶対に実行されない(型が違うので)
}
JavaScript

「型が変だぞ」と早めに気付けるので、
「API が文字列の ‘false’ を返してきている」という設計ミスに気付きやすくなります。

ここが重要です。
「値が自分の期待する型で来ているか?」を常に意識して、
=== の結果から違和感を検知する、という感覚がとても大事です。
== はその違和感を隠してしまうので、学びのチャンスもバグ検知のチャンスも奪ってしまいます。


まとめ:初心者として == と === をどう扱うか

  • == … 型を勝手に変換してから比較する「ゆるい等価演算子」
  • === … 型も値も同じときだけ true になる「厳密等価演算子」

数値と文字列を比べたとき、
5 == "5" は true だけれど、5 === "5" は false。

0 / "" / false / null / undefined まわりでの == は特に危険で、
「自分の意図しない true / false」を返しがち。

=== を使えば「型が違うなら違う」とハッキリ分かるので、
型のミスや設計の問題に気付きやすい。

ここが重要です。
実践的な結論としては、「比較は全部 === / !== を使う」と決めてしまってください。
== / != は、「null と undefined をまとめて扱いたい」など、
“本当に仕様として暗黙の変換を利用したい” ときにだけ、意識して使う。
それまでは封印するくらいがちょうどいいです。

最後に、ちょっとした「感覚トレーニング」を置いておきます。
次の結果を、自分の頭で予想してから実行してみてください。

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

console.log("" == 0);
console.log("" === 0);

console.log("5" == 5);
console.log("5" === 5);

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

「自分の予想」と「実際の結果」がズレたところが、
あなたと JavaScript の比較ルールのギャップです。
そのギャップを 1 つずつ潰していく感覚で、=== を味方につけていきましょう。

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