== と === の違いを一言でいうと
== と === の一番大事な違いは、これだけです。
==… 型を「勝手に変換」してから比較する(ゆるい比較)===… 型も値も「そのまま」比べる(厳密な比較)
ここが本当に重要です。
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 はこうします。
- 文字列
"5"を「数値の 5」に変換する - 数値 5 と数値 5 を比べる
- 同じなので 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""(空文字) → 数値 0nullとundefined→ お互いだけ特別に等しい
など、人間の直感とズレた変換 が行われます。
一方、=== を使うとこうです。
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) {
// 絶対に実行されない(型が違うので)
}
JavaScript2: 型のミスにすぐ気付ける
たとえば API から来た値が「文字列の “1”」だと知らずに、
数値の 1 と比べたとします。
const apiValue = "1";
if (apiValue == 1) {
// true になってしまう
}
JavaScript== を使うと、型の違いに気付くチャンスを失います。=== なら、
if (apiValue === 1) {
// false →「あ、文字列で来てるんだな」と気付ける
}
JavaScriptというふうに、「型が違うこと」がそのままエラーのサインになります。
ここが重要です。=== を使うことは、「型の取り扱いミスを早期に発見するためのセーフティーネット」です。== はミスを隠し、=== はミスを露わにしてくれます。
長期的に見て、どちらがうれしいかは明らかですよね。
「じゃあ == は完全に不要なの?」という疑問について
唯一よく使われるパターン:null と undefined をまとめて判定
null と undefined に限っては、== に「便利な特別ルール」があります。
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 つずつ潰していく感覚で、=== を味方につけていきましょう。
