等価演算子とは?プログラムで値の一致を比較する記号の使い方

システム開発・テクノロジー
等価演算子とは?ざっくりと3行で
  • プログラムで2つの値が等しいかどうかを比較するための演算子のこと。多くの言語では「==」(イコールイコール)で表記し、比較結果をtrue(等しい)またはfalse(等しくない)で返す
  • JavaScriptには「==」(等価演算子)と「===」(厳密等価演算子)の2種類があり、型変換(型強制)を伴う比較か・型も含めた厳密な比較かが異なるという重要な違いがある
  • 代入演算子「=」と等価演算子「==」を混同するのは初心者に多い間違いで、特にif文の条件式でのタイプミスがバグの原因になる

【深掘り】これだけ知ってればOK!

等価演算子の基本的な使い方を見てみよう。5 == 5はtrue、5 == 3はfalseを返す。文字列の比較は hello == hello でtrue、hello == world でfalse。数値と文字列の比較はプログラミング言語によって挙動が異なる点に注意が必要だ。

JavaScriptの等価演算子には特に注意が必要だ。==は型強制(型変換)を行うため、5と文字列の5を等しいと判定することがある。0 == falseもtrueになる。これがJavaScriptで==の使用が問題視される理由だ。===(厳密等価演算子)は型変換を行わず、型と値が両方一致した場合のみtrueを返す。JavaScriptでは基本的に===の使用が推奨されている。

他の言語での等価演算子の挙動を比較しよう。Pythonでは「==」が型安全で、5と文字列の5の比較はfalseになる。Javaでは「==」はプリミティブ型の比較には使えるが、オブジェクトの場合は参照(アドレス)の比較になるため、文字列の比較は「.equals()」メソッドを使う必要がある。

if文の条件式で等価演算子を書き間違えるのが最も一般的なバグの原因だ。「if (x = 5)」と書いてしまうと、これはxに5を代入する式で常にtrueになる。正しくは「if (x == 5)」または「if (x === 5)」だ。この種のバグを防ぐため、ESLintのeqeqeqルールをオンにして===を強制することがチーム開発では一般的な設定だ。

ヨーダ記法(5 == x という書き方)は左辺に定数を置くことで代入と比較の混同ミスをコンパイルエラーで検出できる手法として知られている。現代ではリンターが自動検出できるため必須ではないが、組み込み系・Cの開発では今でも使われることがある。

よくある誤解

==と===の使い分けを間違えている

JavaScriptで==を使うと型変換が発生して予期しない結果になることがある。0 == falseはtrue、空文字列 == falseはtrue、nullとundefinedは==で等しいという挙動は初見では混乱しやすい。JavaScriptでは基本的に===を使い、明示的に型変換が必要な場合のみ==を検討することが推奨される。

=、==、===が全て同じだと思っている

=は代入演算子でxに値を代入する。==は等価演算子で型変換を伴う比較。===は厳密等価演算子で型も含めた比較。三つは全く異なる操作で、特にif文の条件式での混同がバグの典型的な原因になるため、それぞれの役割を正確に理解することがプログラミングの基礎だ。

会話での使われ方

ITKAGYO運営者デプロイ太郎のアイコン画像

JavaScriptで0 == falseがtrueになってバグが出ました。型変換が起きていたんですね。===を使うべきでした。

初心者プログラマーがJavaScriptの型強制によるバグをデバッグして原因を理解した場面。

ITKAGYO運営者デプロイ太郎のアイコン画像

Javaで文字列の比較に==を使ってたら常にfalseになってました。Javaでは文字列はequals()を使わないといけないんでしたね。

Javaを学び始めたプログラマーが文字列比較の罠に遭遇してデバッグで原因を特定した場面。

ITKAGYO運営者デプロイ太郎のアイコン画像

JavaScriptのコードレビューで==が混じっているのを見つけました。ESLintでeqeqeqルールをオンにして===を強制するように設定してください。

シニアエンジニアがコードレビューで等価演算子の使い方の統一をESLintで自動化することを提案している場面。

【まとめ】3つのポイント

  • 2つの値が等しいかどうかを比較するtrueまたはfalseを返す演算子:プログラムの条件分岐・ループ・バリデーションの全てで使われる最も基本的な演算子のひとつで、言語ごとの挙動の違いを理解することがバグを防ぐ鍵になる
  • JavaScriptでは===を使うことでバグを未然に防ぐ:==の型強制によって予期しない結果が生まれるため、JavaScriptでは基本的に===を使い型と値の両方を厳密に比較することが現代的なコーディング規約の標準だ
  • =、==、===の3つを明確に区別する:代入・等価比較・厳密等価比較は全く異なる操作で、特にif文条件式での混同がバグの典型的な原因になるため、それぞれの役割を正確に理解することがプログラミングの基礎だ

よくある質問

Q
なぜJavaScriptでは===が推奨されているのですか?
A

==は型強制(暗黙の型変換)を行うため0 == falseや空文字列 == falseがtrueになるなど直感に反する結果が多数あります。===は型変換を行わず型と値の両方が一致した場合のみtrueを返すため、予期しない結果を防げます。ESLintのeqeqeqルールで===の使用を強制することが一般的です。

Q
PythonとJavaScriptの等価演算子の違いは何ですか?
A

Pythonの==はJavaScriptの===に近い動作をします。Pythonでは5と文字列の5の比較はfalseで型変換は行われません。Pythonでオブジェクトの同一性(同じオブジェクトかどうか)を確認するにはis演算子を使います。

Q
Javaで文字列の比較に==を使ってはいけないのはなぜですか?
A

Javaでは文字列はオブジェクトなので==はメモリアドレス(参照)の比較になります。同じ内容の文字列でも異なるオブジェクトとして生成されている場合==はfalseを返します。文字列の内容を比較するには.equals()メソッドを使う必要があります。

Q
等価演算子と比較演算子の違いは何ですか?
A

等価演算子(==、===、!=、!==)は2つの値が等しいかどうかを判定します。比較演算子(<、>、<=、>=)は大小関係を判定します。どちらもtrueかfalseを返しますが、等価演算子は等しいかどうか、比較演算子は大きいか小さいかを判定する点が異なります。

この用語と一緒に知っておきたい用語

用語 この記事との関連
JavaScript JavaScriptを押さえると本記事の理解がさらに深まります。WebブラウザがネイティブにサポートするプログラミングはJavaScriptのみ。フォームのバリデーション・アニメーション・SPAなどブラウザ上のインタラクションはすべてJavaScriptが担う
プログラム プログラムを押さえると本記事の理解がさらに深まります。コンピュータに何をどの順番でさせるかを書き並べた指示書、それがプログラムだ
アイコン アイコンを押さえると本記事の理解がさらに深まります。アプリやファイル、操作ボタンなどをひと目でわかる小さな絵で表したもの、それがアイコンだ
コンパイルエラー コンパイルエラーとの関係を知ると全体像がつかみやすくなります。プログラムを機械語に翻訳する作業中に見つかる、文法ミスや記述ルールの違反のことだよ!
バリデーション 本記事のテーマと実務上セットで使われることが多い用語です。ユーザーやシステムが入力したデータが期待する形式・範囲・内容に合致しているかを検証(確認)する処理・仕組みのこと

【出典】参考URL

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Equality :MDN「等値演算子(==)」の解説
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Strict_equality :MDN「厳密等値演算子(===)」の解説
https://docs.python.org/ja/3/reference/expressions.html#comparisons :Python公式「比較演算」のドキュメント

コメント

「IT用語、難しすぎて心が折れそう……」という方のための、ハードル低めな用語辞典です。

情報レベルは「基礎中の基礎」。会話を止めないためのエッセンスだけを抽出しています。分かりやすさを追求するあまり、時々例え話が暴走しているかもしれませんが、そこは「ほどよく」聞き流していただけると幸いです。
ほどよくIT用語辞典システム開発・テクノロジー
デプロイ太郎のSNSを見てみる!!