a === NaN
の使用は常にfalse
であるため、バグです。それが動作するように定義されているかNaN
あるので
この動作は、バグではありません。しかし、実際にa === NaN
をプログラムで使用した場合、は、が常にfalse
という結果になるため、バグになります。
a !== a
...非常に悪い考えです。これは面白いJavaScriptの事実ですが、確かに "ベストプラクティス"ではありません。
私はあなたの「確か」に同意しません。元のグローバルisNaN()
関数の問題(私はすぐに説明します)のため、a !== a
は、歴史的にはNaN
をテストする最良の方法でした。実際、このテクニックを使用するのは非常に一般的な慣行なので、経験豊富なJavaScript開発者の大部分がそれに精通していることを期待しています。
NaN
はです。これは、それ自身と同じではないとテストする唯一の値です。
isNaN(a)
についてこれはなぜ提案された解決策ではないのですか?私が見逃した違いや問題はありますか?
元、グローバルisNaN()
functionは、実際にその引数がNaN
であるかどうかをテストするものではありません。引数が他の数値以外の値であるかどうかはテストされません。まず、引数を数値に変換し、その変換結果がNaN
に等しいかどうかをテストします。この暗黙の変換は、文字列が値NaN
と等しくなくても、たとえばisNaN("test")
がtrue
を返すことを意味します。 isNaN("")
は、空の文字列を0
に強制することができるため、false
を返します。その動作が「はい」の場合はisNaN()
を使用してください。
のECMAScript 2015分の6は、古い学校a !== a
に同等の結果を与え、値NaN
のために特別にテストをしている、Number.isNaN()
、新しい機能を導入しましただから、なぜすべてがあります。
あなたはa !== a
より明確に何かをしたいとあなたがこれを行うことができ、より長いコードを気にしない場合は、Number.isNaN()
をサポートしていない古いブラウザ(基本的には古いIE)のために、コメントで示唆したように:
typeof a == "number" && isNaN(a)
... 2つのうちの1つですNumber.isNaN()
polyfills suggested by MDN。 (もう1つはa !== a
を使用しています)
ありがとうございます@nnnnnn。私は私の質問を編集しました。 –