JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptの等価演算子を徹底解説:=== と == の違いを理解しよう

JavaScriptには、値の等価性を比較する方法が4つあります。本記事では、等価性を判定するために使われる各演算子の特徴、型強制(type coercion)とは何か、そしてJavaScriptでtruthy・falsyの値を評価する際に注意すべき特異な挙動について、コード例と比較表を交えて詳しく解説します。

厳密等価比較(===)

厳密等価演算子は、イコール3つ(===)で表されます。この演算子の目的は、値だけでなく型も含めて比較することです。

const strictComparison = (a, b) => {
  console.log(typeof a);
  console.log(typeof b);
  return a === b;
}
 
strictComparison(8, '8'); // false

上記の例にある strictComparison 関数は、2つの値を受け取り、その2つの値が厳密に等しいかどうかを返します。

一見すると、どちらも値が 8 なので同じように見えます。しかし、厳密等価演算子は型も確認します。この例で atypeof a で調べると 'number' が返され、同様に btypeof b で調べると 'string' が返されます。

型が異なるため、結果は false となります。

=== による特殊な比較

厳密等価演算子を使うと、いくつか直感に反する比較結果になります。以下は面接などでよく質問される例です。

被演算子1typeof 被演算子1被演算子2typeof 被演算子2戻り値
nullobjectnullobjecttrue
undefinedundefinedundefinedundefinedtrue
nullobjectundefinedundefinedfalse
NaNnumberNaNnumberfalse
falseboolean"false"stringfalse
falsebooleanfalsebooleantrue
""string""stringtrue
""stringundefinedundefinedfalse

もう1つ注意すべき点として、この演算子はデータ構造の比較には使えません。配列やオブジェクトを比較するには、より高度な方法が必要です。

上記の表のほとんどの項目は、型が一致するかどうかで結果が決まります。唯一の例外は NaN です。NaN は理論上どんな値にもなりうるため、等しいかどうかを判定できず、常に false と評価されます。

厳密不等価比較(!==)

厳密不等価演算子は、感嘆符とイコール2つ(!==)で表されます。この演算子は、2つの値が値と型の両方において等しくないかどうかを評価します。

const strictInequalityComparison = (a, b) => {
  console.log(typeof a);
  console.log(typeof b);
  return a !== b;
}
 
strictInequalityComparison("8", 8); // true

上記の例にある strictInequalityComparison 関数は、2つの値を受け取り、その2つの値が厳密に等しくないかどうかを返します。

一見すると、どちらも同じ値を持つため「等しい」ように見えます。しかし、厳密不等価演算子も厳密等価演算子と同様に、型を確認します。

この例で atypeof a で調べると 'string' が返され、btypeof b で調べると 'number' が返されます。型が異なるため、結果は true となります。

!== による特殊な比較

厳密不等価演算子でも、いくつか直感に反する比較結果になります。以下は面接などでよく質問される例です。

被演算子1typeof 被演算子1被演算子2typeof 被演算子2戻り値
nullobjectnullobjectfalse
undefinedundefinedundefinedundefinedfalse
nullobjectundefinedundefinedtrue
NaNnumberNaNnumbertrue
falseboolean"false"stringtrue
falsebooleanfalsebooleanfalse
""string""stringfalse
""stringundefinedundefinedtrue

厳密等価演算子と同様に、オブジェクトや配列間の比較は行えません。

実務で覚えておきたいポイント

JavaScript開発の現場では、条件分岐のロジックを書く際に使うのは、ほとんどの場合 ===!== の2つの演算子です。意図しない型変換によるバグを防ぐためにも、まずはこの2つを使いこなせるようになりましょう。

緩い等価比較(==)

緩い等価演算子は、イコール2つ(==)で表されます。この演算子の目的は、等しいかどうかを評価する前に、両方の値を共通の型へ型強制(type coercion)、つまり型変換することです。

const looseComparison = (a, b) => {
  console.log(typeof a);
  console.log(typeof b);
  return a == b;
}
 
looseComparison(8, '8'); // true

上記の例にある looseComparison 関数は、2つの値を受け取り、その2つの値が緩く等しいかどうかを返します。

一見すると、片方は数値、もう片方は文字列なので同じようには見えません。しかし、緩い等価演算子は型を確認しません。比較の前に型を揃えようとするため、2番目の被演算子が数値に変換されてから比較され、結果は true となります。

== による特殊な比較

緩い等価演算子でも、いくつか直感に反する比較結果になります。以下は面接などでよく質問される例です。

被演算子1typeof 被演算子1被演算子2typeof 被演算子2戻り値
nullobjectnullobjecttrue
undefinedundefinedundefinedundefinedtrue
nullobjectundefinedundefinedtrue
NaNnumberNaNnumberfalse
falseboolean"false"stringfalse
falsebooleanfalsebooleantrue
""string""stringtrue
""stringundefinedundefinedfalse

ここでのほとんどの項目は、厳密等価比較のセクションと同じ結果になります。注目すべき例外は、nullundefined を緩く比較すると true になるという点です。

緩い不等価比較(!=)

緩い不等価演算子は、感嘆符とイコール1つ(!=)で表されます。この演算子は、2つの値が値のみにおいて等しくないかどうかを評価します。その際、両方の引数を同じ型に変換しようとします。

const looseInequalityComparison = (a, b) => {
  console.log(typeof a);
  console.log(typeof b);
  return a != b;
}
 
looseInequalityComparison("8", 8); // false

上記の例にある looseInequalityComparison 関数は、2つの値を受け取り、その2つの値が緩く等しくないかどうかを返します。

一見すると、どちらも同じ値を持つため等しいように見えます。しかし、緩い不等価演算子も緩い等価演算子と同様に、比較前に両方の被演算子の型を揃えます。型変換後に値が同じになるため、結果は false となります。

!= による特殊な比較

緩い不等価演算子でも、いくつか直感に反する比較結果になります。以下は面接などでよく質問される例です。

被演算子1typeof 被演算子1被演算子2typeof 被演算子2戻り値
nullobjectnullobjectfalse
undefinedundefinedundefinedundefinedfalse
nullobjectundefinedundefinedfalse
NaNnumberNaNnumbertrue
falseboolean"false"stringtrue
falsebooleanfalsebooleanfalse
""string""stringfalse
""stringundefinedundefinedtrue

厳密等価演算子と同様に、オブジェクトや配列間の比較は行えません。

ここでのほとんどの項目は、厳密不等価比較のセクションと同じ結果になります。注目すべき例外は、nullundefined を緩く比較すると false になるという点です。

まとめ

本記事では、JavaScriptにおける等価性を比較する4つの方法について解説しました。最も重要なポイントは、イコール3つ(===)とイコール2つ(==)は同じ演算子ではないということです。=== は型と値の両方を厳密に評価するのに対し、== は両方を同じ型に変換した後、値のみを評価します。予期しない挙動を避けたい場合は、原則として厳密な演算子(=== / !==)を使うことをおすすめします。

  1. JavaScriptの緩い等価(==)演算子とは?仕組みと使い方を解説

    JavaScriptにおける「緩い等価(Loose Equality)」を表す演算子が「==」(抽象的等価演算子)です。この演算子を使うと、比較対象となるオペランド同士の値がまず共通の型へ自動的に変換され、その上で等しいかどうかが判定されます。 そのため、型が異なる値同士であっても比較が成立します。例えば、数値の 1 と文字列の 1 を比較すると、文字列側が数値へ変換されて true となります。また、undefined == null も特別なルールによって true と評価されます。 一方で、暗黙的な型変換によって意図しない結果を招く可能性があるため、実務ではより厳密な比較を行う「===

  2. JavaScriptでfalsy値(偽と評価される値)を見分ける方法

    JavaScriptにおけるfalsy値とはJavaScriptでは、値をBoolean型として評価したときに「false」とみなされる値がいくつか存在します。これらは「falsy値(偽の値)」と呼ばれます。条件分岐や論理演算において、意図しない動作を防ぐために、どの値がfalseと評価されるかを正しく理解しておくことが重要です。JavaScriptでfalseと評価される主な値は以下の通りです。false — Boolean型のfalseそのもの0 — 数値のゼロ空文字列:、、または ``(テンプレートリテラル)null — 値が存在しないことを示す特殊な値undefined — 値が未定義