Internet ExplorerにおけるNaNの比較挙動とその正しい実装

ブラウザ

JavaScriptにおいて、特に「NaN === NaN」がfalseになるという挙動は、初めてこの挙動を知った時に驚くかもしれません。Internet Explorerはこの挙動を標準仕様通りに実装していたのか、それとも独自の動作をしていたのかについて解説します。

NaNとは?

まず、「NaN(Not-a-Number)」は、数値ではない結果を表す特殊な値です。たとえば、0で割る、文字列を数値に変換しようとするなどの演算結果として得られます。

「NaN」は自体が数値として比較されることがないため、例えば「NaN === NaN」はfalseになります。これはJavaScriptの標準仕様であり、他の数値と同様に直接比較できないようになっています。

Internet ExplorerにおけるNaNの挙動

Internet Explorer(特に古いバージョン)では、標準仕様に従って「NaN === NaN」がfalseとなるべきですが、バージョンによっては挙動に微妙な差がある可能性がありました。特に、古いバージョンでは、NaNの比較に対する正しい動作が不安定だったため、他のブラウザと同じ挙動が得られないケースもありました。

Internet Explorer 11以前のバージョンでは、JavaScriptエンジンが標準に対して一部不完全な実装がされていたため、NaNの動作が他のブラウザと異なる場合がありました。例えば、NaN同士を比較してtrueが返る、もしくは他の不具合が生じることがありました。

NaN === NaNがfalseとなる理由

JavaScriptの仕様では、NaNは他のNaNと比較してもfalseを返すように定義されています。これは、NaNが「数値ではない」という概念を表すため、自己同一性が存在しないことを意味します。つまり、NaNは常に「不正な数値」として処理されるため、「NaN === NaN」はfalseとなります。

この挙動は、他の数値と異なり、NaNが「未知の数値」であることを示すための仕様です。たとえば、以下のように確認できます。

console.log(NaN === NaN); // false

他のブラウザと比較した挙動

最新のブラウザ(Chrome、Firefox、Safariなど)では、NaNに対する挙動は一貫しており、NaN同士の比較でfalseが返されます。これらのブラウザでは、JavaScriptの仕様に従った正しい動作が行われており、開発者が意図した通りに処理されます。

Internet Explorerでは、古いバージョンにおいて標準仕様から外れた挙動が観察されることがあったため、特に旧バージョンでの互換性を考慮する必要がありました。これにより、他のブラウザとの挙動に違いが生じていました。

まとめ

Internet Explorerは「NaN === NaN」がfalseとなる標準挙動を正しく実装していないことがありましたが、モダンブラウザではこの仕様に従った正しい動作が行われています。JavaScriptを使った開発において、NaNの比較挙動を意識し、古いブラウザの互換性を確保するためには注意が必要です。

コメント

タイトルとURLをコピーしました