比較演算子

JavaScript の比較には、厳密な (strict) ものと、型変換を伴うものがあります。厳密な比較 (例えば ===) では、オペランドが同じ型で、かつ内容が一致しているときだけ真になります。より一般的に使われる抽象的な (abstract) 比較 (例えば ==) では、比較の前にオペランドを同じ型に変換します。抽象的な関係比較 (例えば <=) では、比較の前に、まずオペランドをプリミティブな値に変換し、さらに同じ型に変換します。

文字列は、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 = {"value":"key"}, object2={"value":"key"};
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 = {"value":"key"}, object2={"value":"key"};
object1 === object2 // false

厳密には等しくない (!==)

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

構文

x !== y

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

関係演算子

関係演算子は、比較の前に、各オペランドに対して valueOf() 関数を呼ぶ。

より大きい (>)

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

構文

x > y

4 > 3 // true

より大きいまたは等しい (以上) (>=)

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

構文

 x >= y

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

より小さい (<)

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

構文

 x < y

3 < 4 // true

より小さいまたは等しい (以下) (<=)

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

構文

 x <= y

3 <= 4 // true

等価演算子を使う

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

厳密等価演算子 (===!==) は Strict Equality Comparison Algorithm を使用して、同一の型かどうかに関する比較も行います。オペランドの型が異なれば、結果は常に false になりますので、5 !== '5' となります。

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

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

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

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

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

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

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

仕様

仕様書 策定状況 コメント
ECMAScript 1st Edition (ECMA-262) 標準 最初の定義。JavaScript 1.0 で実装。
ECMAScript 3rd Edition (ECMA-262) 標準 === と!== 演算子を追加。JavaScript 1.3 で実装。
ECMAScript 5.1 (ECMA-262) 標準 仕様書内のいくつかのセクションで定義: Relational Operators, Equality Operators
ECMAScript 2015 (6th Edition, ECMA-262) 標準 仕様書内のいくつかのセクションで定義: Relational Operators, Equality Operators
ECMAScript 2017 Draft (ECMA-262) ドラフト 仕様書内のいくつかのセクションで定義: Relational Operators, Equality Operators

ブラウザ実装状況

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本サポート (有) (有) (有) (有) (有)
機能 Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本サポート (有) (有) (有) (有) (有) (有)

関連情報

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

タグ: 
 このページの貢献者: ambi, yyss, teoli, ethertank, Potappo
 最終更新者: ambi,