ECMAScript等価演算子

2つの変数が等しいかどうかを確認することは、プログラム設計において非常に重要な演算です。原始値を処理する場合、この演算は非常に単純ですが、オブジェクトに関連する場合は少し複雑になります。

ECMAScript は、原始値を処理するための等性演算子と、オブジェクトを処理するための全等性演算子と非全等性演算子の2セットを提供しています。

等号と非等号

ECMAScript では、等号はダブル等号(==)で表され、2つの演算子が等しい場合にのみ true を返します。非等号は感叹号と等号(!=)で表され、2つの演算子が等しくない場合にのみ true を返します。2つの演算子が等しいかどうかを確認するために、これらの演算子は型変換を行います。

型変換の規則は以下の通りです:

  • Boolean 値の演算子は、相等性を確認する前に、数字値に変換されます。false は 0 に変換され、true は 1 です。
  • ある演算子が文字列で、もう一方が数値の場合、相等性を確認する前に、文字列を数値に変換しようとします。
  • ある演算子がオブジェクトで、もう一方が文字列の場合、相等性を確認する前に、オブジェクトを文字列に変換しようとします。
  • ある演算子がオブジェクトで、もう一方が数値の場合、相等性を確認する前に、オブジェクトを数値に変換しようとします。

比較の際には、この演算子は以下の規則にも従います:

  • 値 null と undefined は等しいです。
  • 相等性を確認する際には、null と undefined を他の値に変換することはできません。
  • ある演算子が NaN であれば、等号は false を返し、非等号は true を返します。
  • 2つの演算子がオブジェクトであれば、比較されるのはその参照値です。2つの演算子が同じオブジェクトを指している場合、等号は true を返し、そうでない場合は、2つの演算子は等しくありません。

重要な注意:2つの数がどちらも NaN であっても、等号は false を返します。なぜなら、規則に従って NaN は NaN と等しくないからです。

以下の表に特殊な状況とその結果が示されています:

表現式
null == undefined true
"NaN" == NaN false
5 == NaN false
NaN == NaN false
NaN != NaN true
false == 0 true
true == 1 true
true == 2 false
undefined == 0 false
null == 0 false
"5" == 5 true

全等号と非全等号

等号と非等号の同種の演算子は全等号と非全等号です。これらの演算子は等号と非等号と同じことを行いますが、相対性を確認する前に型変換を実行しません。

全等号は三つの等号(===)で表されます。型変換が不要で演算子が等しい場合にのみ true を返します。

例えば:

var sNum = "66";
var iNum = 66;
alert(sNum == iNum);	//「true」を出力
alert(sNum === iNum);	//「false」を出力

このコードでは、最初の alert は等号を使用して文字列「66」と数字 66 を比較し、「true」を出力します。前述の通り、これは文字列「66」が数字 66 に変換されるからです。二番目の alert は全等号を使用して型変換なしで文字列と数字を比較し、もちろん、文字列は数字でないため、「false」を出力します。

非全等号は感叹号と二つの等号(!==)で表されます。型変換が不要で演算子が異なる場合にのみ true を返します。

例えば:

var sNum = "66";
var iNum = 66;
alert(sNum != iNum);	//「false」を出力
alert(sNum !== iNum);	//「true」を出力

ここでは、最初の alert は非等号を使用して文字列「66」を数字 66 に変換し、それが二番目の演算子 66 と等しいことを確認します。したがって、計算結果は「false」です。なぜなら、二つの演算子は等しいからです。二番目の alert は非全等号を使用しています。この演算は、「sNum」と「iNum」が異なるかどうかを尋ねています。この質問の答えは「はい(true)」です。なぜなら、sNum は文字列であり、iNum は数字であり、当然異なるからです。