等価演算子 (==)
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 つのオペランドが等しいことを検査し、論理値で結果を返します。
厳密等価演算子とは異なり、オペランドの型が異なる場合には型の変換を試みてから比較を行います。
試してみましょう
console.log(1 == 1);
// 予想される結果: true
console.log("hello" == "hello");
// 予想される結果: true
console.log("1" == 1);
// 予想される結果: true
console.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; // true
1 == "1"; // true
0 == false; // true
0 == null; // false
0 == undefined; // false
0 == !!null; // true (論理 NOT 演算子を参照)
0 == !!undefined; // true (論理 NOT 演算子を参照)
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",
};
console.log(object1 == object2); // false
console.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); // 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("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> |
ブラウザーの互換性
Loading…