JavaScript/==
==
(Equality operator) は、ECMAScript における等価演算子です。この演算子は、2つのオペランドを比較し、それらが等しいかどうかを判断します。等価演算子は型変換(型強制)を行い、異なる型の値を比較する際に特定のルールに従います[1]。
構文
EqualityExpression[?In, ?Yield, ?Await] == RelationalExpression[?In, ?Yield, ?Await]
EqualityExpression[?In, ?Yield, ?Await]
: 比較される左側のオペランドRelationalExpression[?In, ?Yield, ?Await]
: 比較される右側のオペランド
この演算子は、以下のように使用されます:
let x = 5; let y = "5"; console.log(x == y); // true(型変換が行われる)
13.11 Equality Operators
等価演算子は、2つの値が等しいかどうかを判断するために使用されます。ECMAScript には次の2種類の等価演算子があります:
13.11.1 Runtime Semantics: Evaluation
等価演算子( ==
)の実行時セマンティクスは、以下の手順で評価されます:
- 左オペランドを評価する
- 右オペランドを評価する
- Abstract Equality Comparison アルゴリズムを使用して、2つの値を比較する
Abstract Equality Comparison アルゴリズムは、以下のルールに従います:
動作
等価演算子( ==
)は、以下の順序で動作します:
例
基本的な使用法
以下のプログラムは、等価演算子の基本的な使用法を示しています。
// 基本的な使用法 let x = 5; let y = 5; console.log(x == y); // true let a = 10; let b = 20; console.log(a == b); // false
このプログラムでは、同じ型(数値)の値を比較しています。
型変換の例
以下のプログラムは、等価演算子による型変換の例を示しています。
// 数値と文字列 console.log(5 == "5"); // true(文字列 "5" が数値 5 に変換される) // ブーリアンと数値 console.log(true == 1); // true(true が 1 に変換される) console.log(false == 0); // true(false が 0 に変換される) // null と undefined console.log(null == undefined); // true(特別なケース) console.log(null == 0); // false(null は数値に変換されない) // オブジェクトと基本型 console.log([1] == 1); // true([1] は "1" に変換され、さらに 1 に変換される)
このプログラムでは、異なる型の値を比較した場合の型変換の仕組みを示しています。
条件文での使用
以下のプログラムは、条件文内での等価演算子の使用例を示しています。
// 条件文での使用 let value = "5"; if (value == 5) { console.log("値は 5 に等しい"); // 出力される } let emptyArray = []; if (emptyArray == false) { console.log("空の配列は false と等しい"); // 出力される }
このプログラムでは、条件文の中で等価演算子を使用して、型変換が発生する例を示しています。
注意点
- 予期しない結果: 型変換のルールにより、直感に反する結果が生じることがあります。
- 推移性の欠如:
a == b
かつb == c
であっても、a == c
が常に成り立つとは限りません。 - NaN:
NaN
は他のどの値とも等しくなく、NaN == NaN
はfalse
を返します。
// 予期しない結果の例 console.log([] == ""); // true console.log([] == 0); // true console.log("" == 0); // true // 推移性の欠如 console.log("0" == 0); // true console.log(0 == false); // true console.log("0" == false); // true // NaN の例 console.log(NaN == NaN); // false
厳密等価演算子との違い
等価演算子( ==
)と厳密等価演算子( ===
)の主な違いは、以下の通りです:
- 等価演算子(==): 型変換を行ってから比較する
- 厳密等価演算子(===): 値と型の両方が等しい場合にのみ
true
を返す
例:
let x = 5; let y = "5"; console.log(x == y); // true(型変換が行われる) console.log(x === y); // false(型が異なるため) console.log(null == undefined); // true(型変換により) console.log(null === undefined); // false(型が異なるため)
ベストプラクティス
- 予期しない型変換を避けるため、多くの場合は厳密等価演算子(
===
)の使用が推奨されます。 - コードの意図を明確にするために、型変換が必要な場合は明示的に行うことが良い習慣です。
// 推奨される方法 let x = 5; let y = "5"; // 暗黙的な型変換に依存する(理解しにくい) if (x == y) { // ... } // 明示的な型変換を行う(理解しやすい) if (x === Number(y)) { // ... } // または厳密等価演算子を使用する if (x === y) { // 実行されない }