JavaScript には、厳密に比較する方法と、型変換した結果で比較する方法の 2 通りがあります。厳密な比較 (例えば ===
) では、オペランドが同じ型である場合に限り真になります。より一般的に使用される抽象的な比較 (例えば ==
) では、比較する前にオペランドを同じ型に変換します。抽象的な関係演算子 (例えば <=
) では比較する前に、始めにオペランドをプリミティブな値に変換し、さらに同じ型に変換します。
文字列は、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 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
厳密には等しくない (!==)
厳密不等価演算子は、オペランド同士が等しくない、型が等しくない、あるいはその両方ならば真を返します。
構文
x !== y
例
3 !== '3' // true 4 !== 3 // true
関係演算子
より大きい (>)
大なり演算子は、左オペランドが右オペランドより大きいならば、真を返します。
構文
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 は以下のように文字列、数値、論理値、オブジェクトに変換します。
- 数値と文字列を比較するとき、文字列は数値に変換されます。JavaScript は文字列の数値リテラルを
Number
型の数値に変換しようと試みます。最初に、その文字列の数値リテラルから数学的な値を引き出します。次に、最も近いNumber
型の値にこの値を丸めます。 - もしオペランドの片方が
Boolean
ならば、その論理オペランドはtrue
ならば1
に、そしてfalse
ならば+0
に変換されます。 - オブジェクトを数値または文字列と比較する場合、JavaScript はそのオブジェクトの既定値を返そうとします。演算子はそのオブジェクトを、そのオブジェクトの
valueOf
やtoString
といったメソッドを用いて、プリミティブな値か、String
か、あるいはNumber
の値に変換しようとします。そうした変換の試みが失敗したときにはランタイムエラーが生成されます。 - 比較対象がプリミティブ値である場合のみ、オブジェクトはプリミティブ値に変換されます。両方のオペランドがオブジェクトであれば、それらはオブジェクトとして比較され、両方が同じオブジェクトを参照する場合にのみ、テストは「真」となります。
// 両方のオペランドが文字列型 (すなわちプリミティブな文字列) であるため、true が返ります: 'foo' === 'foo' var a = new String('foo'); var b = new String('foo'); // false。a と b はオブジェクト型であり、異なるオブジェクト同士の比較となります。 a == b // false。a と b はオブジェクト型であり、異なるオブジェクト同士の比較となります。 a === b // true。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 |
---|---|---|---|---|---|---|
基本サポート | (有) | (有) | (有) | (有) | (有) | (有) |