等価 (==)

等価演算子 (==) は、二つのオペランドが等しいことを検査し、論理値で結果を返します 厳密等価演算子とは異なり、オペランドの型が異なる場合には肩を変換を試みてから比較を行います。

構文

x == y

解説

等価演算子 (== および !=) は、抽象等価比較アルゴリズムを使用して二つのオペランドを比較します。これは、およそ次のようにまとめることができます。

  • 両方のオペランドがオブジェクトである場合、同じオブジェクトを指している場合に限り true を返します。
  • 一方のオペランドが null で、もう一方が undefined であった場合は true を返します。
  • オペランドの型が異なる場合は、比較前に同じ型に変換を試みます。
    • 数値と文字列を比較する場合、文字列を数値に変換しようとします。
    • 一方のオペランドが Boolean である場合、その Boolean のオペランドが true である場合は 1 に、 false である場合は +0 に変換します。
    • オペランドのうちの1つがオブジェクトで、もう一方が数値または文字列である場合は、そのオブジェクトの valueOf() および toString() メソッドを使用してプリミティブに変換しようとします。
  • オペランドが同じ型である場合は、次のよう比較します。
    • String: 両方のオペランドが同じ文字を同じ順序で持っている場合のみ、 true を返します。
    • Number: 数値型は同じ値の数値である場合のみ、 true を返します。 +0-0 は同じ値と見なされます。一方のオペランドが NaN である場合は false を返します。
    • Boolean: 両方のオペランドが共に true であるか、共に false である場合のみ true になります。

この演算子と厳密等価 (===) 演算子の最も顕著な違いは、厳密等価演算子が型変換を試みない点です。厳密等価演算は、オペランドの型が異なる場合は常に異なるものと見なします。

型変換がない場合の比較

1 == 1;              // true
"hello" == "hello";  // true

型変換がある場合の比較

"1" ==  1;            // true
1 == "1";             // true
0 == false;           // true
0 == null;            // false
0 == undefined;       // false
null == undefined;    // true

const number1 = new Number(3);
const number2 = new Number(3);
number1 == 3;         // true
number1 == number2;   // false

オブジェクトの比較

const object1 = {"key": "value"}
const object2 = {"key": "value"};

object1 == object2 // false
object2 == object2 // true

文字列と String オブジェクトの比較

new String() を使用して構築された文字列はオブジェクトであることに注意してください。文字列リテラルとの比較を行うと、 String オブジェクトは文字列リテラルに変換され、その中身が比較されます。ただし、両方のオペランドが String オブジェクトであった場合は、オブジェクトとして比較され、同じオブジェクトを参照している場合だけ比較に成功します。

const string1 = "hello";
const string2 = String("hello");
const string3 = new String("hello");
const string4 = new String("hello");

console.log(string1 == string2); // true
console.log(string1 == string3); // true
console.log(string2 == string3); // true
console.log(string3 == string4); // false
console.log(string4 == string4); // true

Date と文字列の比較

const d = new Date('December 17, 1995 03:24:00');
const s = d.toString(); // for example: "Sun Dec 17 1995 03:24:00 GMT-0800 (Pacific Standard Time)"
console.log(d == s);    //true

仕様書

仕様書
ECMAScript (ECMA-262)
Equality operators の定義

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
Strict inequality (a !== b)Chrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 4Opera 完全対応 4Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 0.1.100

凡例

完全対応  
完全対応

関連情報