このガイドでは、ECMAScript 仕様の「厳密な等価比較」セクションで定義されている JavaScript の厳密な等価演算子 (===
) の複雑さを詳しく説明します。 その機能を段階的に見てみましょう:
===
アルゴリズム: 詳細===
演算子は、次のアルゴリズムを使用して等しいかどうかを判断します。
型チェック: 演算子は最初に 2 つの値の型を比較します。型が異なる場合は、すぐに false
を返します。 型マッチングは、型が同一の場合にのみ次のステップに進みます。
タイプ固有の比較:
数字:
NaN === NaN
は false
と評価されます (分岐の重要な点)。true
を返します。 0
と -0
は等しいと見なされます (true
)。文字列: 文字ごとの比較により等しいかどうかが判断されます。 同一のシーケンスは true
を生成します。それ以外の場合、false
.
ブール値: true === true
と false === false
はどちらも true
を返します。 それ以外の場合、false
.
オブジェクト (配列と関数を含む): ===
は、参照の等価性 をチェックします。 両方の値が同じメモリ位置 (同じオブジェクト) を指している場合にのみ、true
.
null
および undefined
: null === null
および undefined === undefined
は true
を返します。ただし、型の違いにより null === undefined
は false
となります。
NaN === NaN
は false
これはよくある混乱の原因です。 仕様では、NaN
(Not-a-Number) はそれ自体と等しくないものとして定義されています。これは、NaN
が無効または未定義の数値結果を表すためです。 2 つの未定義の結果を等しいものとして比較することは、論理的な一貫性を欠きます。
例:
<code class="language-javascript">NaN === NaN; // false</code>
NaN
を確実にチェックするには、Number.isNaN()
または Object.is()
を利用します。
<code class="language-javascript">Number.isNaN(NaN); // true Object.is(NaN, NaN); // true</code>
0 === -0
は true
仕様では、 0
と -0
は同等のものとして扱われます。これは、ほとんどの数学的演算において、それらの動作が区別できないためです。 ただし、特定のシナリオでは微妙な違いが存在します (たとえば、1 / 0
は Infinity
を生成しますが、1 / -0
は -Infinity
を生成します)。 区別が必要な状況では、Object.is()
:
<code class="language-javascript">NaN === NaN; // false</code>
オブジェクトを比較する場合、===
参照等式を評価します。同一の内容を持つ2つのオブジェクトは、メモリ内の同じオブジェクトでない限り、等しいとは見なされません。
<code class="language-javascript">Number.isNaN(NaN); // true Object.is(NaN, NaN); // true</code>
<code class="language-javascript">Object.is(+0, -0); // false</code>
以上がJavaScriptの「===」を紐解くの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。