比較演算子
JavaScriptは、厳格な比較と型変換を行う比較の両方を持ちます。
厳格な比較(例:===
)は、オペランド(対象)が同じ型である場合にのみtrueとなります。
より一般的に使用される抽象的な比較(例:==
)は、比較を行う前にオペランドを同じ型に変換します。
関係についての抽象的な比較(例:<=
)は、比較の前にオペランドはまずプリミティブに、次に同じ型に変換されます。
文字列の比較は、Unicode値を使用して標準の辞書順を基に比較されます。
比較の特徴:
- 2つの文字列が、同じ文字の並びであり、同じ長さであり、それぞれ対応する位置に同じ文字がある場合に、厳格に等しいとされます。
- 2つの数値が、数的に等しい(同じ数値である)場合に、厳格に等しいとされます。 NaNは、NaN自身を含む如何なるものとも等しくなることはありません。 正の、または負のゼロはそれぞれ等しいとされます。
- 2つの真偽値のオペランドは、両方がtrue、または両方がfalseであれば、厳格に等しいとされます。
- 2つの別々のオブジェクトは、厳格な比較でも抽象的な比較でも、等しくなることはありません。
- 式のオブジェクト(Object)比較では、 そのオペランドが同じオブジェクトを参照している場合にのみ、trueとなります。
-
NullとUndefinedの型は、
厳格な比較ではそれ自身との比較
(null === null
、undefined === undefined
)であれば等しいとされ、 抽象的な比較であればお互いの比較(null == undefined
)で等しいとされます。
等価演算子
等価、同一演算子の対比表
x | y | == | === | Object.is |
---|---|---|---|---|
undefined | undefined | true | true | true |
null | null | true | true | true |
true | true | true | true | true |
false | false | true | true | true |
"foo" | "foo" | true | true | true |
{ foo: "bar" } | x | true | true | true |
0 | 0 | true | true | true |
+0 | -0 | true | true | false |
0 | false | true | false | false |
"" | false | true | false | false |
"" | 0 | true | false | false |
"0" | 0 | true | false | false |
"17" | 17 | true | false | false |
[1,2] | "1,2" | true | false | false |
new String("foo") | "foo" | true | false | false |
null | undefined | true | false | false |
null | false | false | false | false |
undefined | false | false | false | false |
{ foo: "bar" } | { foo: "bar" } | false | false | false |
new String("foo") | new String("foo") | false | false | false |
0 | null | false | false | false |
0 | NaN | false | false | false |
"foo" | NaN | false | false | false |
NaN | NaN | false | false | true |
等価(==)
等価演算子はオペランド(対象)が同じ型で無ければ、同じ型に変換し、次に厳格な比較を適用します。 もし、いずれかのオペランドが数値または真偽値のどちらかであれば、可能であればそのオペランドは数値に変換され、 もし、いずれかのオペランドが文字列であれば、可能であればその文字列オペランドは数値に変換されます。 もし両方のオペランドがオブジェクトの場合は、JavaScriptはオペランドがメモリ内の同じオブジェクトを参照している際に等価とする、 内部参照の比較を行います。
/** 文法 **/
x == y
/** 例 **/
3 == 3 // true
"3" == 3 // true
3 == '3' // true
不等価 (!=)
不等価演算子は、そのオペランドが等価では無い場合にtrueを返します。 もし2つのオペランドが同じ型では無い場合、 JavaScriptは比較のために適した型にオペランドを変換することを試みます。 もし両方のオペランドがオブジェクトの場合は、JavaScriptはオペランドがメモリ内の異なるオブジェクトを参照している際に不等価とする、 内部参照の比較を行います。
/** 文法 **/
x != y
/** 例 **/
3 != 4 // true
3 != "5" // true
同一 / 厳格な等価 (===)
同一演算子は、オペランドが型の変換無しに、厳格に等価(上記参照)である場合にtrueを返します。
/** 文法 **/
x === y
/** 例 **/
3 === 3 // true
3 === '3' // false
非同一 / 厳格な不等価 (!==)
非同一演算子は、オペランドが等価では無い、または同じ型では無い、またはその両方の場合にtrueを返します。
/** 文法 **/
x !== y
/** 例 **/
3 !== '3' // true
4 !== 3 // true
関係演算子
不等号(大なり)演算子 (>)
左オペランドが右オペランドより大きい場合、この演算子はtrueを返します。
/** 文法 **/
x > y
/** 例 **/
4 > 3 // true
等号付き不等号(大なりイコール)演算子 (>=)
左オペランドが右オペランドより大きい、または等価の場合、この演算子はtrueを返します。
/** 文法 **/
x >= y
/** 例 **/
4 >= 3 // true
3 >= 3 // true
不等号(小なり)演算子 (<)
この演算子は、左オペランドが右オペランドより小さい場合にtrueを返します。
/** 文法 **/
x < y
/** 例 **/
3 < 4 // true
等号付き不等号(小なりイコール)演算子 (<=)
左オペランドが右オペランドより小さい、または等価の場合、この演算子はtrueを返します。
/** 文法 **/
x <= y
/** 例 **/
3 <= 4 // true
等価演算子の使い方
標準の等価演算子(==
と!=
)は、
2つのオペランドの比較に抽象的な等価比較アルゴリズムを使用します。
もしオペランドの型が異なる場合は、比較を行う前に同じ型に変換することが試みられ、
例えば式5 == '5'
は、比較の前に右の文字列は数値(Number)に変換されます。
厳格な等価演算子(===
と!==
)は、
厳格な等価比較アルゴリズムを使用し、
同じ型のオペランドの等価比較に適しています。
オペランドが異なる型であれば、5 !== '5'
がそうであるように、結果は常にfalseになります。
値同様にオペランドが特定の型でなければいけない場合、 またはオペランドの型も一致していることが重要な場合に、厳格な等価演算子を使用します。 もし同じ型でなかったとしても、2つのオペランドが等しいと比較することを許可する場合には、 標準の等価演算子を使用します。
比較の際に型変換が行われる場合(厳格では無い比較)、 JavaScriptは文字列、数値、真偽値、オブジェクトのオペランドを下記のように変換します。
-
数値と文字列の比較の際に、文字列は数値に変換されます。
JavaScriptは、数を表す文字列リテラル(例えば、
"5"
)を数値(Number)型の値に変換することを試みます。 まず、数学的な値が数を表す文字列リテラルから取り出され、 次に直近の数値(Number)型の値に丸められます。 -
オペランドの片方が真偽値(Boolean)の場合、
その真偽値は
true
であれば1に、false
であれば+0に変換されます。 -
もしオブジェクトが数値、または文字列と比較される場合、
JavaScriptはオブジェクトのデフォルト値を返すことを試みます。
演算子はオブジェクトを、そのオブジェクトの
valueOf
とtoString
メソッドを使用して、 文字列(String)または数値(Number)のプリミティブ値に変換することを試みます。 もし、このオブジェクトの変換の試みが失敗すると、ランタイムエラーが発生します。 - オブジェクトがプリミティブ値に変換されるのは、 プリミティブ値と比較される場合のみであることに注意してください。 もし両方のオペランドがオブジェクトの場合、それらはオブジェクトとして比較され、 その両方が同じオブジェクトを参照している場合にのみ、その等価検証はtrueとなります。
注意: 「文字列オブジェクト」は「オブジェクト(Object)型」であり、文字列ではありません! 文字列オブジェクトが使用されることは珍しいため、次のような結果になることに驚くかもしれません。
// 両方のオペランドは文字列(String)型であるため、trueとなります。
// (すなわち、文字列のプリミティブ値)
'foo' === 'foo'
var a = new String('foo');
var b = new String('foo');
// aとbはオブジェクト(Object)型であり、
// 異なるオブジェクトを参照しているため、falseとなります。
a == b
// 同様にaとbはオブジェクト(Object)型であり、
// 異なるオブジェクトを参照しているため、falseとなります。
a === b
// aと'foo'は異なる型であり、aのオブジェクトは比較される前に、
// 文字列の'foo'に変換されるため、trueとなります。
a == 'foo'
仕様
ブラウザ互換性
機能 | Chrome | Firefox (Gecko) |
IE | Opera | Safari |
---|---|---|---|---|---|
基本 | ◯ | ◯ | ◯ | ◯ | ◯ |
機能 | Android | Chrome for Android |
Firefox Mobile |
IE Mobile |
Opera Mobile |
Safari Mobile |
---|---|---|---|---|---|---|
基本 | ◯ | ◯ | ◯ | ◯ | ◯ | ◯ |
関連項目
© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。
- 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
- 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
- MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
- "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。