JavaScriptの世界へようこそ。この言語は非常に自由で、時に「お節介」なほど親切な一面を持っています。
開発の現場で、バグの原因として最も多く、かつ初心者さんが最初に「えっ、なんで!?」と頭を抱えるポイント。それが今日お話しする「==(抽象等価)」と「===(厳密等価)」の違いです。
結論から先に言うと、現場の合言葉は「迷ったら === を使え」。これだけ覚えて帰ってもらってもいいくらいですが、なぜそうなのか、その「泥臭い舞台裏」を一緒に見ていきましょう。
—
1. 「==」は、お節介な翻訳家
まず、`==`(抽象等価演算子)についてです。こいつは、とてもお節介な性格をしています。
例えば、数字の `10` と、文字列の `”10″` を比較するとどうなると思いますか? 人間から見れば「どっちも10だよね」ですが、コンピュータは本来、数字と文字を明確に区別します。
でも、`==` はこう考えます。
「おっ、データ型が違うな。でも中身は似てるし……よし、僕が勝手に変換して合わせてあげよう!」
これを「型強制(Type Coercion)」と呼びます。以下のようなことが起きます。
// 比較してみましょう
console.log(10 == “10”); // true になる!
/
なぜか?
== が気を利かせて、文字列の “10” を数字の 10 に変換してくれたからです。
でも、この「親切」が、大規模な開発では予期せぬバグの温床になります。
/
例え話:コンビニのレジにて
想像してみてください。あなたがコンビニで「100円」のガムを買おうとしています。
`==` は、あなたの財布に入っている「100円玉(数字)」と、店員さんが渡す「100円という文字が書かれたレシート(文字列)」を「同じ価値のもの」として強引に握手させようとします。
「まあ、どっちも100円って書いてあるし、いいじゃん!」という適当さ。これが `==` の正体です。
—
2. 「===」は、潔癖な番人
対して `===`(厳密等価演算子)は、非常にストイックな性格です。
こいつは「型」と「値」の両方が完全に一致していないと、絶対に「イエス(true)」とは言いません。一切の妥協を許さない、誠実な番人です。
// 厳密にチェックします
console.log(10 === “10”); // false になる!
/
=== はこう考えます。
「左は数字、右は文字列。たとえ中身の数字が同じでも、データとしての性質が違うなら別物だ!」
/
現場のエンジニアが `===` を好むのは、「あやふやな挙動を許さないから」です。プログラムが予期せぬ型変換を勝手に行うと、後から「なんでここで `false` になるはずが `true` になってるんだ?」と原因を探すのに数時間溶かすことになります。`===` を使えば、そんな悲劇を未然に防げるのです。
—
3. なぜ「==」を使ってはいけないのか?
「型を変換してくれるなら便利じゃない?」と思ったあなた。鋭い視点です。しかし、JavaScriptの型変換ルールは非常に複雑で、慣れているプロでもミスをします。
恐ろしい例:
console.log(0 == false); // true
console.log(0 == “”); // true
console.log(“” == false); // true
見てください、このカオスを! 0も、空の文字列も、falseも、`==` にかかれば「みんな同じ!」と判定されてしまいます。こんな挙動を把握しながらコードを書くのは、精神衛生上よくありません。
—
4. 今日から意識してほしいこと
これからJavaScriptを書くときは、以下のルールを自分に課してみてください。
1. 基本は常に `===` を使う。
2. `==` を使うのは、「どうしても型を無視して比較したい時(nullとundefinedを同時にチェックしたい時など)」に限定する。
もし誰かに「なんで `===` なの?」と聞かれたら、こう答えてあげてください。
「コードの挙動をあやふやにしたくないから。型まで含めて『等しい』と言い切れる関係性だけを大切にしたいんだ」と。
最初は慣れないかもしれませんが、この「厳密さ」こそが、あなたの書くコードをより堅牢で、信頼できるものにしてくれる第一歩です。
プログラミングは、道具との付き合い方です。`==` のような「お節介なツール」に振り回されず、`===` という「誠実なパートナー」と共に、心地よいコーディングライフを楽しんでくださいね!
大丈夫、最初はみんなここでつまずきます。一つひとつ、納得しながら進んでいきましょう。

コメント