JavaScript/==

カテゴリ:Book:JavaScript#==%20

== (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種類の等価演算子があります:

  1. 等価演算子( ==: 型変換を行って比較
  2. 厳密等価演算子( ===: 型変換を行わずに比較

13.11.1 Runtime Semantics: Evaluation

等価演算子( ==)の実行時セマンティクスは、以下の手順で評価されます:

  1. 左オペランドを評価する
  2. 右オペランドを評価する
  3. Abstract Equality Comparison アルゴリズムを使用して、2つの値を比較する

Abstract Equality Comparison アルゴリズムは、以下のルールに従います:

  1. 同じ型の場合: 値を直接比較する
  2. 異なる型の場合: 型変換を行ってから比較する
    • nullundefined は互いに等しいと見なされる
    • 数値と文字列を比較する場合、文字列を数値に変換する
    • ブーリアン値を他の型と比較する場合、ブーリアン値を数値に変換する( true1false0
    • オブジェクトを基本型(プリミティブ)と比較する場合、オブジェクトを基本型に変換する(通常は valueOf() または toString() メソッドを使用)

動作

等価演算子( ==)は、以下の順序で動作します:

  1. 型の比較: 両方のオペランドが同じ型の場合、直接比較する
  2. 型変換: 型が異なる場合、特定のルールに従って変換を行う
  3. 結果の決定: 変換後に比較を行い、ブーリアン値( true または false)を返す

基本的な使用法

以下のプログラムは、等価演算子の基本的な使用法を示しています。

// 基本的な使用法
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 == NaNfalse を返します。
// 予期しない結果の例
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) {
  // 実行されない
}

脚註

  1. 等価演算子は厳密等価演算子( ===)とは異なり、型変換を行ってから比較するため、予期しない結果が生じることがあります。

外部リンク

カテゴリ:Book:JavaScript#==%20 カテゴリ:JavaScript
カテゴリ:Book:JavaScript カテゴリ:JavaScript カテゴリ:Pages using the JsonConfig extension