JavaScriptの条件式で型の違いに注意しよう!厳密比較と抽象比較
生徒
「先生、JavaScriptで値を比べるときに==と===って違いがあるって聞いたんですが、どう違うんですか?」
先生
「いい質問ですね。これはJavaScriptの『比較演算子』の話で、型の違いをどう扱うかがポイントなんです。順を追って説明しますね。」
生徒
「型って何ですか?難しい言葉ですが…?」
先生
「型は『値の種類』のことです。例えば数字、文字列、真偽値(はい・いいえのようなもの)などがあります。JavaScriptでは同じ数字でも『文字の0』と『数字の0』は違う型なんですよ。」
生徒
「なるほど。じゃあ==と===の違いは何ですか?」
先生
「それぞれ『抽象比較(ゆるい比較)』と『厳密比較(かたく比較)』と言います。具体例を使って説明しましょう。」
1. 抽象比較(==)とは?型を自動で変換して比較する
==は値が違う型でも、自動で型を変換してから比較します。だから型が違っても、意味が同じなら「等しい」と判定します。
console.log(0 == "0"); // true(数字の0と文字の"0"は等しいと判定)
console.log(false == 0); // true(falseは数字の0と同じ扱い)
console.log(null == undefined); // true(特別な扱いで等しいと判定)
ただし、予期せぬ結果になることもあるので注意が必要です。
2. 厳密比較(===)とは?型も値も完全に同じか比較する
===は型が違ったら絶対に「違う」と判定します。値も型も両方同じときだけ「等しい」となります。
console.log(0 === "0"); // false(型が違うから等しくない)
console.log(false === 0); // false(型が違う)
console.log(null === undefined); // false(型も値も違う)
console.log(10 === 10); // true(型も値も同じ)
型の違いによるミスを防ぎたいなら、===を使うのが安全です。
3. なぜ型の違いに注意が必要なのか?
JavaScriptは型変換が自動で行われるため、==を使うと意図しない判定結果になることがあります。特にプログラミング初心者は予測しにくい動きに戸惑うことが多いです。
例えば、数字と文字列を比較したとき、数字の「0」と文字列の「0」は違う型ですが、==では同じと判定されます。これがバグの原因になることがあります。
4. 抽象比較と厳密比較の使い分け方
基本的には型の違いでの誤解を避けるために、===の厳密比較を使うことをおすすめします。
ただし、nullやundefinedの判定では==を使うことが便利なケースもあります。
// nullかundefinedかをまとめて判定したいとき
let value = null;
if (value == null) {
console.log("値はnullかundefinedです。");
}
このようにケースによって使い分けることが重要です。
5. 文字列と数字を比較する注意点
文字列と数字を比較するとき、==は自動で数字に変換して比較するため予想外の結果になることがあります。
console.log("5" == 5); // true(文字列"5"は数字の5に変換されて等しい)
console.log("5" === 5); // false(型が違うので等しくない)
なので、型の違いに注意しながら書くことが大切です。
6. 真偽値(Boolean)との比較の注意
falseと0や空文字などは==だと同じと判定されることがあります。
console.log(false == 0); // true
console.log(false == ""); // true
console.log(false === 0); // false
console.log(false === ""); // false
意図しない判定を防ぐためにも、できるだけ===を使いましょう。
7. typeof演算子で型を確認する方法
比較の前に、変数の型を調べたい場合はtypeof演算子を使うと便利です。
let x = "10";
console.log(typeof x); // "string"
let y = 10;
console.log(typeof y); // "number"
型を知ることで、比較の際に誤解を減らせます。
8. 実践例:厳密比較を使った安全な条件式
例えば、ユーザーの入力値をチェックするときは、厳密比較を使うと安全です。
// ユーザーの入力が数字の10かどうかを判定
let input = "10";
if (input === 10) {
console.log("入力は数字の10です。");
} else {
console.log("入力は数字の10ではありません。");
}
この場合は「数字の10」と「文字列の"10"」は違うと判定されます。