52
parseFloat("NaN")

「NaN」を返しますが、

parseFloat("NaN") == "NaN"

falseを返します。さて、それがfalseを返すのはおそらく良いことですが、これがどのように行われるのかわかりません。JavaScriptの作成者は、これを特別なケースにしましたか?そうでなければ、これがどのようにfalseを返すのか理解できないからです。

4

8 に答える 8

39

更新 2

ECMAScript 6 の新機能はObject.is()関数です。これは、===チェックをさらに強化するように設計されています。この新しい関数の利点の 1 つは、Object.is(NaN, NaN)true を返すようになったことです。ECMAScript 6 を利用できる場合、これが最も読みやすく一貫したソリューションになります。

オリジナル

これを確認する適切な方法は次のとおりです。

isNaN(parseInt(variable))

チェックしているものが NaN の場合、その関数は true を返します。このメソッドは JavaScript 仕様に組み込まれています。

jQuery の使用

jQuery は元々、ブラウザー間の不一致に対処するために独自のisNaN関数を組み込み、いくつかの追加チェックを追加して、VanillaJS のバージョンの代わりにそれらのバージョンを使用できるようにしました。

jQuery の更新

jQuery 1.7 以降、この関数は に変更されました$.isNumeric()

スイッチのドキュメント

この Stack Overflow questionを見るisNaN()と、直観的には「正しくない」回答と見なされるが、仕様では正しい回答が返される場合がたくさんあることがわかります。

バニラを避ける大きな理由の 1 つは、isNaN()それnullが を返すfalseため、数字だと思わせることです。ただし、jQuery 関数は、はるかに広い範囲の直感的な結果をカバーしています。

ドキュメントから:

jQuery 3.0 以降、 $.isNumeric() は、引数が数値型の場合、または文字列型で有限数に強制できる場合にのみ true を返します。それ以外の場合はすべて false を返します。

于 2012-09-27T19:05:08.617 に答える
38

JavaScript 関数が を返す場合NaN、これはリテラル文字列ではなく、グローバル空間のオブジェクト プロパティです。string と比較することはできません"NaN"

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/NaNを参照してください

于 2011-08-08T00:17:13.823 に答える
37

これは特殊なケースです。NaN は Javascript でそれ自体と等しくない唯一のものです。

文字列と NaN オブジェクトに関する他の回答も正しいですが。

于 2011-08-08T00:17:14.747 に答える
12

NaNそれ自体と等しくないオブジェクトの数少ない例の 1 つです。実際、このプロパティは共通bool IsNaN(number)メソッドを実装するために使用されます。

function isNaN(x)
{ 
    return x != x; 
}
于 2014-05-22T21:29:25.493 に答える
9

isNaN数値ではないすべての値に対して機能します

isNaN('foo') == true // a string is indeed not a number
isNaN(NaN) == true
isNaN(12) == false
isNaN([1,2,3]) == true // an array is also not a number

ただし、具体的に確認したい場合NaN、または型強制を回避したい場合。代わりに
使用できますNumber.isNaN

Number.isNaN('foo') == false
Number.isNaN(NaN) == true
Number.isNaN(12) == false
Number.isNaN([1,2,3]) == false
于 2015-10-01T09:42:07.477 に答える
8
  • Number(ParseFloat によって返される) と比較してstring string変換された場合Number
  • NaNは他のどのオブジェクトとも等しくありません ( を含むNaN)

あなたが得るNaN==NaN。2 番目のルールでは false です。

于 2011-08-08T00:23:53.287 に答える