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 は数字であり、当然異なるからです。