JavaScriptでプログラミングをしていると、値を比較する際に「===」と「==」の2種類の演算子に遭遇します。これらは見た目は似ていますが、両者がどのような基準で比較を行うのかについては明確な違いが存在します。この記事では、それぞれの挙動と違いについて、具体的なコード例を交えて解説します。
「==」(等価演算子:Loose Equality)とは何か
「==」は、比較する2つの値のデータ型が異なる場合、JavaScriptエンジンが自動的に同じ型になるように変換(暗黙の型変換)してから比較を行います。型が違っていても、実質的な値が同じになるように変換できれば「true」を返します。
具体例:
console.log(1 == '1'); // true を返します。文字列の'1'が数値の1に変換されるためです。
console.log(true == 1); // true を返します。真偽値のtrueは数値の1に変換されます。
console.log(null == undefined); // true を返します。JavaScriptの仕様上、これらは等価として扱われます。
console.log([] == false); // true を返します。空の配列は数値の0に、falseも0に変換されるためです。
このように、「==」を使用すると意図しない型変換が背後で行われます。これにより、開発者が直感的に予測しづらい結果を生む可能性があります。
「===」(厳密等価演算子:Strict Equality)とは何か
一方、「===」は、値だけでなくデータ型も完全に一致しているかどうかを判定します。暗黙の型変換は一切行われません。型が異なれば、その時点で即座に「false」を返します。
具体例:
console.log(1 === '1'); // false を返します。数値と文字列で型が異なるためです。
console.log(true === 1); // false を返します。真偽値と数値で型が異なります。
console.log(null === undefined); // false を返します。型が異なります。
console.log([] === false); // false を返します。オブジェクト(配列)と真偽値で型が異なります。
型変換を伴わないため、挙動が非常にシンプルになります。結果が予測しやすくなり、予期せぬバグを防ぎやすくなります。
比較結果のまとめ
両者の違いをわかりやすく比較するために、表にまとめます。
| 比較する値 A | 比較する値 B | A == B の結果 | A === B の結果 | 理由(型の違いなど) |
5 (数値) | '5' (文字列) | true | false | 型が異なるため、厳密比較ではfalseになります。 |
0 (数値) | false (真偽値) | true | false | 型が異なるため、厳密比較ではfalseになります。 |
null | undefined | true | false | == では特別に等価とみなされますが、型は異なります。 |
どちらを使用するべきか
様々な可能性や状況を考慮すると、現在のJavaScript開発においては、原則として「===」(厳密等価演算子)を使用することが推奨されます。「==」の暗黙の型変換は、記述量を少し減らすことができる反面、コードの読み手に複雑な型変換のルールをすべて把握することを要求するため、バグの温床になりやすいからです。
ただし、「==」がどのような状況でも不要であるというわけではありません。例えば、変数 == null と記述することで、変数が null または undefined のどちらかであるかを一度にチェックできるという利便性もあります。しかし、このような特定のテクニックを利用する場合を除き、常に「===」を用いて型と値を厳密に評価する方が、より安全で保守性の高いコードになります。
これらの演算子の特性を深く理解し、状況に応じて適切に使い分けることが重要です。

コメント