概要
比較演算子 (Comparison operator) のオペランドは、数値にも文字列にもなることができます。文字列は、Unicodeの値を用い、標準の辞書に基づいて比較されます。
JavaScript には、厳密に比較する方法と、型変換した結果で比較する方法の2通りがあります。厳密に比較する場合、オブジェクトは同じ型でなければならず、かつ、以下の通りになります。
- 2つの文字列は、文字の順序が同一で、長さが等しく、かつ対応する位置の文字が等しいとき、厳密に等しくなります。
- 2つの数値は、数字的に等しいとき(数字の値が等しいとき)、厳密に等しくなります。NaNは、どんなものとも(NaNとも)等しくなりません。プラスゼロとマイナスゼロはそれぞれに対し等しくなります。
- 2つの論理オペランドは、両者が
trueあるいは両者がfalseのとき、厳密に等しくなります。 - 2つのオブジェクトは、それらが同じオブジェクトを参照しているとき、厳密に等しくなります。
- Null と Undefined の型は、
==の関係が成り立ちます(しかし===の関係は成り立ちません)。
以下の表に、比較演算子について説明します。
| 演算子 | 説明 | 真(true1)を返す例 |
|---|---|---|
等しい (==) | もし2つのオペランドが同じ型ではないならば、Javascriptはオペランドを変換し、そして厳密な比較を適用します。もしどちらかのオペランドが数値または論理値ならば、オペランドは可能ならば数値に変換されますが、そうでなくもしどちらかのオペランドが文字列ならば、他方のオペランドは可能ならば文字列に変換されます。 |
|
等しくない (!=) | もしオペランド同士が等しくないならば真を返します。もし2つのオペランドが同じ型ではないならば、Javascriptは適切な型にオペランドを変換して比較しようと試みます。 |
|
厳密に等しい (===) | オペランド同士が、型を変換することなく(上に示した通り)厳密に等しいならば真を返します。 |
|
厳密には等しくない (!==) | オペランド同士が等しくない、型が等しくない、あるいはその両方ならば真を返します。 |
|
より大きい (>) | 左オペランドが右オペランドより大きいならば、真を返します。 |
|
より大きいまたは等しい(以上) (>=) | 左オペランドが右オペランドより大きいまたは等しいならば、真を返します。 |
|
より小さい (<) | 左オペランドが右オペランドより小さいならば、真を返します。 |
|
より小さいまたは等しい(以下) (<=) | 左オペランドが右オペランドより小さいまたは等しいならば、真を返します。 |
|
1 この例では、var1 に3という値が割り当てられ、var2 に4という値が割り当てられていると仮定しています。
等価演算子を使う
通常の等価演算子 (== と !=) はオペランドの型に関係なく2つのオペランドを比較します。厳密等価演算子 (=== と !==) は同一の型かどうかに関する比較も行います。
alert(5 == "5"); // true
alert(5 === "5"); //false オペランドがその値だけでなく特定の型でなければならない場合、あるいはオペランドの正確な型が重要である場合には、厳密等価演算子を使ってください。それ以外では通常の等価演算子を使いますが、その場合は2つのオペランドがたとえ同じ型でなくても比較が可能になります。
型の変換が必要とされるときは、Javascript は以下のように文字列、数値、論理値、オブジェクトに変換します。
- 数値と文字列を比較するとき、文字列は数値に変換されます。Javascript は文字列の数値リテラルを
Number型の数値に変換しようと試みます。最初に、その文字列の数値リテラルから数学的な値を引き出します。次に、最も近いNumber型の値にこの値を丸めます。 - もしオペランドの片方が
Booleanならば、その論理オペランドはtrueならば 1 に、そしてfalseならば +0 に変換されます。 - オブジェクトを数値または文字列と比較する場合、Javascript はそのオブジェクトの既定値を返そうとします。演算子はそのオブジェクトを、そのオブジェクトの
valueOfやtoStringといったメソッドを用いて、プリミティブな値か、Stringか、あるいはNumberの値に変換しようとします。そうした変換の試みが失敗したときにはランタイムエラーが生成されます。 - 比較対照がプリミティブ値である場合のみ、オブジェクトはプリミティブ値に変換されます。両方のオペランドがオブジェクトであれば、それらはオブジェクトとして比較され、両方が同じオブジェクトを参照する場合にのみ、テストは「真」となります。
Mozilla Developer Network