このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docsコミュニティーについてもっと知り、仲間になるにはこちらから。
等価演算子 (==)
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
等価演算子 (==) は、 2 つのオペランドが等しいことを検査し、論理値で結果を返します。厳密等価演算子とは異なり、オペランドの型が異なる場合には型の変換を試みてから比較を行います。
In this article
試してみましょう
console.log(1 == 1);// 予想される結果: trueconsole.log("hello" == "hello");// 予想される結果: trueconsole.log("1" == 1);// 予想される結果: trueconsole.log(0 == false);// 予想される結果: true構文
x == y解説
等価演算子 (== および!=) は、IsLooselyEqual の意味を提供します。これは、およそ次のようにまとめることができます。
- オペランドが同じ型である場合、以下のように比較されます。
- オブジェクト: 両方のオペランドが同じオブジェクトを参照している場合に限り
trueを返します。 - 文字列: 両方のオペランドに同じ文字が同じ順番で入っている場合のみ
trueを返します。 - 数値: 両方のオペランドが同じ値である場合のみ
trueを返します。+0と-0は同じ値として扱われます。どちらかのオペランドがNaNである場合はfalseを返します。従って、NaNはNaNとは等しくなりません。 - 論理値: 両方が
trueまたは両方がfalseの場合のみtrueを返します。 - 長整数: 両方のオペランドが同じ値である場合のみ
trueを返します。 - シンボル: 両方のオペランドが同じシンボルを参照している場合のみ
trueを返します。
- オブジェクト: 両方のオペランドが同じオブジェクトを参照している場合に限り
- オペランドの一方が
nullまたはundefinedである場合、もう一方もnullまたはundefinedであればtrueを返します。それ以外の場合はfalseを返します。 - オペランドの一方がオブジェクトで、もう一方がプリミティブである場合、オブジェクトをプリミティブに変換します。
- この段階で、両方のオペランドはプリミティブ(文字列、数値、論理値、シンボル、長整数のいずれか)に変換されます。残りの変換は、ケースバイケースで行われます。
- 両方が同じ型であれば、手順 1 を使用して比較します。
- 一方のオペランドがシンボルで、もう一方がそうでない場合は、
falseを返します。 - 一方のオペランドが論理型で、もう一方がそうでない場合は、論理値から数値への変換が行われます。
trueは 1 に変換され、falseは 0 に変換されます。それから 2 つのオペランドを緩い等価性で比較します。 - 数値から文字列へ:文字列から数値へ変換します。変換に失敗すると
NaNとなり、等価性がfalseとなることが保証されています。 - 数値から長整数へ: 数学的な値で比較します。数値が ±Infinity または
NaNであれば、falseを返します。 - 文字列から長整数へ: 文字列を
BigInt()コンストラクターと同じアルゴリズムを使用して長整数へと変換します。変換に失敗した場合は、falseを返します。
緩い等価性は対称的です。A == B は、A とB がいかなる値であっても(変換の適用順序を除いて)、常にB == A と同一の意味を持ちます。
厳密な等価性演算子(===)との最も顕著な違いは、厳密等価演算子が型変換を一切試みない点です。代わりに、厳密等価演算子はオペランドの型が異なると、常に異なるものと見なします。厳密等価演算子は基本的に段階 1 のみを実行し、それ以外の場合はすべてfalse を返します。
上記のアルゴリズムには「意図的な違反」があります。オペランドの一方がdocument.all の場合、undefined として扱われます。つまり、document.all == null はtrue ですが、document.all === undefined && document.all === null はfalse となります。
例
>型変換がない場合の比較
1 == 1; // true"hello" == "hello"; // true型変換がある場合の比較
"1" == 1; // true1 == "1"; // true0 == false; // true0 == null; // false0 == undefined; // false0 == !!null; // true (論理 NOT 演算子を参照)0 == !!undefined; // true (論理 NOT 演算子を参照)null == undefined; // trueconst number1 = new Number(3);const number2 = new Number(3);number1 == 3; // truenumber1 == number2; // falseオブジェクトの比較
const object1 = { key: "value",};const object2 = { key: "value",};console.log(object1 == object2); // falseconsole.log(object1 == object1); // 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); // trueconsole.log(string1 == string3); // trueconsole.log(string2 == string3); // trueconsole.log(string3 == string4); // falseconsole.log(string4 == string4); // trueDate と文字列の比較
const d = new Date("1995-12-17T03: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配列と文字列の比較
const a = [1, 2, 3];const b = "1,2,3";a == b; // true。 `a` を文字列に変換const c = [true, 0.5, "hey"];const d = c.toString(); // "true,0.5,hey"c == d; // true仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-equality-operators> |