2016-07-07 8 views
1

SonarQube JavaScriptルール(javascript:S2688)は、の使用は常にfalseなので、バグですと言います。SonarQubeはa == aの代わりにa == aを提案します

私はそれに同意しますが、代わりにa !== aを使用すると思います(これはSonarQubeによって提案されています)は非常に悪い考えです。 これは面白いJavaScriptの事実ですが、確かに "ベストプラクティス"ではありません。

何についてNumber.isNaN(a)?これはなぜ提案された解決策ではないのですか?私が見逃した違いや問題はありますか?

+0

ありがとうございます@nnnnnn。私は私の質問を編集しました。 –

答えて

9

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を使用しています)

+1

'typeof a ==" number "&& isNaN(a)'はもっと明白な選択肢かもしれません。この猫には多くの方法があります。 – Bergi

+1

また、 'Number.isNaN(a)'は新規であるということは、すべてのブラウザ(IEなど)ではサポートされていないことに注意してください。一方、 'a!== a'はどのブラウザでも動作します。 –

関連する問題