--- title: 比較演算子 slug: conflicting/Web/JavaScript/Reference/Operators tags: - JavaScript - Operator - Reference - 演算子 translation_of: Web/JavaScript/Reference/Operators translation_of_original: Web/JavaScript/Reference/Operators/Comparison_Operators original_slug: Web/JavaScript/Reference/Operators/Comparison_Operators ---
JavaScript には、厳密な比較と型変換の比較の両方があります。厳密な比較 (例: ===
) は、オペランドが同じ型で、内容も一致している場合にのみ真になります。もっとよく使用される抽象的な比較 (例: ==
) は、比較する前にオペランドを同じ型に変換します。抽象的な関係比較 (例: <=
) では、比較前にまずオペランドがプリミティブ型に変換され、それから同じ型に変換されます。
文字列は Unicode 値を使用した標準的な辞書順に基づいて比較されます。
このデモのソースファイルは GitHub リポジトリに格納されています。デモプロジェクトに協力したい場合は、 https://github.com/mdn/interactive-examples をクローンしてプルリクエストを送信してください。
比較の機能は以下のとおりです。
true
か、どちらも false
のときです。等価演算子は、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
これらの演算子のそれぞれは、比較が行われる前に、そのオペランドをプリミティブに{{Glossary("Type_coercion", "型強制")}}します。両方とも文字列として終わる場合は、辞書順で比較され、そうでない場合は数値に変換されて比較されます。 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 は以下のように {{jsxref("String")}}, {{jsxref("Number")}}, {{jsxref("Boolean")}}, {{jsxref("Object")}} 型のオペランドを変換します。
Number
型の値に変換しようとします。まず、文字列の数値リテラルから数学的な値を引き出します。次に、その値を最も近い Number
型に丸めます。Boolean
ならば、その Boolean オペランドが true
の場合 1 に、false
の場合は +0 に変換されます。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 === b // a と 'foo' は異なる型で、比較前にオブジェクト (a) は // 文字列 'foo' に変換されるので、真 a == 'foo'
仕様書 |
---|
{{SpecName('ESDraft', '#sec-equality-operators', 'Equality Operators')}} |
{{SpecName('ESDraft', '#sec-relational-operators', 'Relational Operators')}} |
{{Compat("javascript.operators.comparison")}}