isNaN
関数仕様の非常に初期のバージョン以降、数値以外の引数に対する動作は混乱を招きました。 isNaN
関数の引数がNumber型でない場合、値は最初にNumberに強制変換されます。次に、結果の値をテストして、NaN
であるかどうかを判断します。したがって、数値型に強制すると有効な非NaN数値(特に、強制すると数値が0または1になる空の文字列とブールプリミティブ)になる非数値の場合、「false」の戻り値は予期しないものになる可能性があります。たとえば、空の文字列は確かに「数字ではありません」。混乱は、「数値ではない」という用語が、IEEE-754浮動小数点値として表される数値に対して特定の意味を持っているという事実から生じています。この関数は、「この値は、数値に強制された場合、IEEE-754の「数値ではない」値ですか?」という質問に答えると解釈する必要があります。
ECMAScript2015には関数。 Number.isNaN(x)
は、x
がNaN
であるかどうかをテストするための信頼できる方法です。ただし、Number.isNaN
を使用しても、NaN
の意味は正確な数値の意味であり、「数値ではない」という意味ではありません。または、Number.isNaN
がない場合、式(x != x)
は、変数x
はNaN
であるかどうか。結果は、isNaN
の信頼性を低下させる誤検知の影響を受けないためです。
isNaN
のポリフィルは次のようになります(ポリフィルは、NaN
の固有の決して等しくない特性を利用します):