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 はそのオブジェクトのデフォルト値を返そうとします。演算子は、オブジェクトの
valueOfやtoStringといったメソッドを用いて、プリミティブな値、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 |
|---|---|---|---|---|---|---|
| 基本サポート | (有) | (有) | (有) | (有) | (有) | (有) |