比較演算子

JavaScript には、厳密な比較と型変換の比較の両方があります。厳密な比較 (例: ===) は、オペランドが同じ型で、内容も一致している場合にのみ真になります。もっとよく使用される抽象的な比較 (例: ==) は、比較する前にオペランドを同じ型に変換します。抽象的な関係比較 (例: <=) では、比較前にまずオペランドがプリミティブ型に変換され、それから同じ型に変換されます。

文字列は Unicode 値を使用した標準的な辞書順に基づいて比較されます。

比較の機能は以下のとおりです。

  • 2 つの文字列が厳密に等しくなるのは、字の順序が等しく、長さが等しく、対応する位置の文字が等しいときです。
  • 2 つの数字が厳密に等しくなるのは、数値的に等しいとき (数字の値が等しいとき) です。NaN は、どんなものとも (Nan とさえも) 等しくなりません。プラスゼロとマイナスゼロは互いと等しくなります。
  • 2 つの論理オペランドが厳密に等しくなるのは、どちらも true か、どちらも false のときです。
  • 2 つの異なるオブジェクトは、厳密な比較でも抽象的な比較でも等しくなりません。
  • オブジェクト比較が等しくなるのは、オペランドが同じオブジェクトを参照しているときだけです。
  • Null と Undefined 型は、自分自身と厳密に等しく、また互いに抽象的に等しくなります。

等価演算子

等価 (==)

等価演算子は、2 つのオペランドが同じ型でないならばオペランドを変換して、それから厳密な比較を行います。両方のオペランドがオブジェクトならば、 JavaScript は内部参照を比較するので、オペランドがメモリ内の同じオブジェクトを参照するときに等しくなります。

構文

x == y

1    ==  1         // true
'1'  ==  1         // true
1    == '1'        // true
0    == false      // true
0    == null       // false
var object1 = {'key': 'value'}, object2 = {'key': 'value'}; 
object1 == object2 // false
0    == undefined  // false
null == undefined  // true

不等価 (!=)

不等価演算子は、オペランド同士が等しくないならば真を返します。2 つのオペランドが同じ型でないならば、JavaScript は適切な型にオペランドを変換して比較しようとします。両方のオペランドがオブジェクトならば、JavaScript は内部参照を比較するので、オペランドがメモリ内の異なるオブジェクトを参照するときには等しくなりません。

構文

x != y

1 !=   2     // true
1 !=  '1'    // false
1 !=  "1"    // false
1 !=  true   // false
0 !=  false  // false

一致 / 厳密等価 (===)

厳密等価演算子は、型変換なしでオペランド同士が (上に示した通り) 厳密に等しければ真を返します。

構文

x === y

3 === 3   // true
3 === '3' // false
var object1 = {'key': 'value'}, object2 = {'key': 'value'};
object1 === object2 //false

不一致 / 厳密不等価 (!==)

厳密不等価演算子は、オペランド同士が等しくないか、型が等しくない、あるいはその両方ならば真を返します。

構文

x !== y

3 !== '3' // true
4 !== 3   // true

関係演算子

これらの演算子のそれぞれは、比較が行われる前に、そのオペランドをプリミティブに型強制します。両方とも文字列として終わる場合は、辞書順で比較され、そうでない場合は数値に変換されて比較されます。 NaN との比較は常に false を生み出します。

大なり演算子 (>)

大なり演算子は、左オペランドが右オペランドより大きければ、真を返します。

構文

x > y

4 > 3 // true

大なりイコール演算子 (>=)

大なりイコール演算子は、左オペランドが右オペランド以上ならば、真を返します。

構文

 x >= y

4 >= 3 // true
3 >= 3 // true

小なり演算子 (<)

小なり演算子は、左オペランドが右オペランドより小さければ、真を返します。

構文

 x < y

3 < 4 // true

小なりイコール演算子 (<=)

小なりイコール演算子は、左オペランドが右オペランド以下ならば、真を返します。

構文

 x <= y

3 <= 4 // true
3 <= 3 // true

等価演算子の使用

標準等価演算子 (==!=) は 2 つのオペランドの比較に抽象的等価比較アルゴリズムを使用します。オペランドの型が異なる場合は、比較を行う前にそれらを同じ型に変換しようとします。例えば 5 == '5' という式では、比較を行う前に右オペランドの文字列を数値に変換します。

厳密等価演算子 (===!==) は厳密等価比較アルゴリズムを使用して、オペランドの型が同一かどうかに関する比較も行います。オペランドの型が異なれば、例えば 5'5' の比較では、同一性比較 5 !== '5'true と評価され、 5 === '5' のチェックは false 評価されます。

厳密等価演算子を使うのは、オペランドが特定の型の特定の値でなければならない場合、言い換えればオペランドの正確な型が重要な場合です。それ以外では、2 つのオペランドが同じ型でなくても比較が可能になる、標準的な等価演算子を使えます。

比較に型の変換が関わるとき (つまり厳密でない比較のとき)、 JavaScript は以下のように String, Number, Boolean, Object 型のオペランドを変換します。

  • 数値と文字列を比較するとき、文字列は数値に変換されます。 JavaScript は文字列の数値リテラルを Number 型の値に変換しようとします。まず、文字列の数値リテラルから数学的な値を引き出します。次に、その値を最も近い Number 型に丸めます。
  • もしオペランドの片方が Boolean ならば、その Boolean オペランドが true の場合 1 に、false の場合は +0 に変換されます。
  • オブジェクトを数値または文字列と比較すると、 JavaScript はそのオブジェクトの既定値を返そうとします。演算子は、オブジェクトの valueOftoString といったメソッドを用いて、プリミティブな値、 StringNumber の値に変換しようとします。変換に失敗したら、ランタイムエラーが発生します。
  • オブジェクトがプリミティブ値に変換されるのは、比較対象がプリミティブ値であるときだけです。両方のオペランドがオブジェクトなら、オブジェクトとして比較され、両方が同じオブジェクトを参照するときだけ真となります。
メモ: String オブジェクトはオブジェクト型であり、文字列型ではありません! String オブジェクトはほとんど使わないので、次の結果に驚くかもしれません。
// 両方のオペランドが文字列型 (すなわちプリミティブな文字列) なので、true
'foo' === 'foo'

var a = new String('foo');
var b = new String('foo');

// a と b はオブジェクト型で、異なるオブジェクトを参照しているので、false
a == b 

// a と b はオブジェクト型で、異なるオブジェクトを参照しているので、false
a === b 

// a と 'foo' は異なる型で、比較前にオブジェクト (a) は 
// 文字列 'foo' に変換されるので、真
a == 'foo'

仕様書

仕様書
ECMAScript (ECMA-262)
Equality Operators の定義
ECMAScript (ECMA-262)
Relational Operators の定義

ブラウザーの互換性

No compatibility data found. Please contribute data for "javascript.operators.comparison" (depth: 1) to the MDN compatibility data repository.

関連情報