比較演算子

by 3 contributors:

比較演算子 (Comparison operator) のオペランドは、数値にも文字列にもなることができます。文字列は、Unicode の値を用い、標準の辞書に基づいて比較されます。

JavaScript には、厳密に比較する方法と、型変換した結果で比較する方法の 2 通りがあります。厳密に比較する場合、オブジェクトは同じ型でなければならず、かつ、以下の通りになります。

  • 2 つの文字列は、文字の順序が同一で、長さが等しく、かつ対応する位置の文字が等しいとき、厳密に等しくなります。
  • 2 つの数値は、数字的に等しいとき(数字の値が等しいとき)、厳密に等しくなります。NaNは、どんなものとも(NaNとさえも)等しくなりません。プラスゼロとマイナスゼロはそれぞれに対し等しくなります。
  • 2 つの論理オペランドは、両者が true あるいは両者が false の時、厳密に等しくなります。
  • 2 つのオブジェクトは、それらが同じオブジェクトを参照しているとき、厳密に等しくなります。
  • Null と Undefined の型は、== の関係が成り立ちます(しかし === の関係は成り立ちません)

以下の表に、比較演算子について説明します。

演算子 説明 真(true1)を返す例
等しい (==) もし2つのオペランドが同じ型ではないならば、JavaScript はオペランドを変換し、そして厳密な比較を適用します。もしどちらかのオペランドが数値または論理値ならば、オペランドは可能ならば数値に変換されますが、そうでなくもしどちらかのオペランドが文字列ならば、他方のオペランドは可能ならば文字列に変換されます。
3 == var1
"3" == var1
3 == '3'
等しくない (!=) もしオペランド同士が等しくないならば真を返します。もし 2 つのオペランドが同じ型ではないならば、JavaScript は適切な型にオペランドを変換して比較しようと試みます。
var1 != 4
var1 != "5"
厳密に等しい (===) オペランド同士が、型を変換することなく(上に示した通り)厳密に等しいならば真を返します。
3 === var1
厳密には等しくない (!==) オペランド同士が等しくない、型が等しくない、あるいはその両方ならば真を返します。
var2 !== 3
3 !== '3'
より大きい (>) 左オペランドが右オペランドより大きいならば、真を返します。
var2 > var1
より大きいまたは等しい(以上) (>=) 左オペランドが右オペランドより大きいまたは等しいならば、真を返します。
var2 >= var1
var1 >= 3
より小さい (<) 左オペランドが右オペランドより小さいならば、真を返します。
var1 < var2
より小さいまたは等しい(以下) (<=) 左オペランドが右オペランドより小さいまたは等しいならば、真を返します。
var1 <= var2
var2 <= 5

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 はそのオブジェクトの既定値を返そうとします。演算子はそのオブジェクトを、そのオブジェクトの valueOftoString といったメソッドを用いて、プリミティブな値か、String か、あるいは Number の値に変換しようとします。そうした変換の試みが失敗したときにはランタイムエラーが生成されます。
  • 比較対照がプリミティブ値である場合のみ、オブジェクトはプリミティブ値に変換されます。両方のオペランドがオブジェクトであれば、それらはオブジェクトとして比較され、両方が同じオブジェクトを参照する場合にのみ、テストは「真」となります。

注記: 「文字列オブジェクト」はオブジェクトであり、プリミティブな「文字列」とは異なります。よって「文字列オブジェクト」同士の比較はオブジェクト同士の比較となります。通常は「文字列オブジェクト」を用いることは少ないので、次のコードはあなたの意表をつく結果となるものかもしれません。

'foo' === 'foo' // 両方がプリミティブな文字列、即ち文字列型であるため、true が返ります

var a = new String('foo'); // プリミティブ値ではなくオブジェクトです
var b = new String('foo');

// 比較 a、b、プリミティブを比較してみます
a == b     // false。 a と b はオブジェクト型であり、異なるオブジェクト同士の比較となります。
a === b    // false。 a と b はオブジェクト型であり、異なるオブジェクト同士の比較となります。
a == 'foo' // true。  a と b は異なる型を持っており、よってオブジェクト a は文字列型に変換されて比較されます。

ドキュメントのタグと貢献者

Contributors to this page: teoli, ethertank, Potappo
最終更新者: teoli,
サイドバーを隠す