Movatterモバイル変換


[0]ホーム

URL:


  1. 開発者向けのウェブ技術
  2. JavaScript
  3. JavaScript リファレンス
  4. 式と演算子
  5. 等価演算子 (==)

このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docsコミュニティーについてもっと知り、仲間になるにはこちらから。

View in EnglishAlways switch to English

等価演算子 (==)

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);// 予想される結果: trueconsole.log("hello" == "hello");// 予想される結果: trueconsole.log("1" == 1);// 予想される結果: trueconsole.log(0 == false);// 予想される結果: true

構文

js
x == y

解説

等価演算子 (== および!=) は、IsLooselyEqual の意味を提供します。これは、およそ次のようにまとめることができます。

  1. オペランドが同じ型である場合、以下のように比較されます。
    • オブジェクト: 両方のオペランドが同じオブジェクトを参照している場合に限りtrue を返します。
    • 文字列: 両方のオペランドに同じ文字が同じ順番で入っている場合のみtrue を返します。
    • 数値: 両方のオペランドが同じ値である場合のみtrue を返します。+0-0 は同じ値として扱われます。どちらかのオペランドがNaN である場合はfalse を返します。従って、NaNNaN とは等しくなりません。
    • 論理値: 両方がtrue または両方がfalse の場合のみtrue を返します。
    • 長整数: 両方のオペランドが同じ値である場合のみtrue を返します。
    • シンボル: 両方のオペランドが同じシンボルを参照している場合のみtrue を返します。
  2. オペランドの一方がnull またはundefined である場合、もう一方もnull またはundefined であればtrue を返します。それ以外の場合はfalse を返します。
  3. オペランドの一方がオブジェクトで、もう一方がプリミティブである場合、オブジェクトをプリミティブに変換します
  4. この段階で、両方のオペランドはプリミティブ(文字列、数値、論理値、シンボル、長整数のいずれか)に変換されます。残りの変換は、ケースバイケースで行われます。
    • 両方が同じ型であれば、手順 1 を使用して比較します。
    • 一方のオペランドがシンボルで、もう一方がそうでない場合は、false を返します。
    • 一方のオペランドが論理型で、もう一方がそうでない場合は、論理値から数値への変換が行われます。true は 1 に変換され、false は 0 に変換されます。それから 2 つのオペランドを緩い等価性で比較します。
    • 数値から文字列へ:文字列から数値へ変換します。変換に失敗するとNaN となり、等価性がfalse となることが保証されています。
    • 数値から長整数へ: 数学的な値で比較します。数値が ±Infinity またはNaN であれば、false を返します。
    • 文字列から長整数へ: 文字列をBigInt() コンストラクターと同じアルゴリズムを使用して長整数へと変換します。変換に失敗した場合は、false を返します。

緩い等価性は対称的です。A == B は、AB がいかなる値であっても(変換の適用順序を除いて)、常にB == A と同一の意味を持ちます。

厳密な等価性演算子(===)との最も顕著な違いは、厳密等価演算子が型変換を一切試みない点です。代わりに、厳密等価演算子はオペランドの型が異なると、常に異なるものと見なします。厳密等価演算子は基本的に段階 1 のみを実行し、それ以外の場合はすべてfalse を返します。

上記のアルゴリズムには「意図的な違反」があります。オペランドの一方がdocument.all の場合、undefined として扱われます。つまり、document.all == nulltrue ですが、document.all === undefined && document.all === nullfalse となります。

型変換がない場合の比較

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

型変換がある場合の比較

js
"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

オブジェクトの比較

js
const object1 = {  key: "value",};const object2 = {  key: "value",};console.log(object1 == object2); // falseconsole.log(object1 == object1); // true

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

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

js
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); // true

Date と文字列の比較

js
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

配列と文字列の比較

js
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

ブラウザーの互換性

関連情報

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp