web-dev-qa-db-ja.com

NaNはNaNと等しいですか?

parseFloat("NaN")

「NaN」を返しますが、

parseFloat("NaN") == "NaN"

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

44
joseph

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

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

34
Phil

Update 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の質問 を見ると、isNaN()が直観的に「間違った」答えと考えられるものを返すが、スペック.

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

ドキュメントから:

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

35
krillgar

これは特別な場合です。NaNはJavascriptでそれ自体と等しくない唯一のものです。

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

33
shelman

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

function isNaN(x)
{ 
    return x != x; 
}
10
  • Number(ParseFloatによって返される)がstringstringに変換されてNumberに変換される場合
  • NaNが他のオブジェクトと等しくない(NaNを含む)

NaN==NaN。 2番目のルールではfalseです。

8
RiaD

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

isNaN('foo') == true
isNaN(NaN) == true
isNaN(12) == false
isNaN([1,2,3]) == true

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

Number.isNaN('foo') == false
Number.isNaN(NaN) == true
Number.isNaN(12) == false
Number.isNaN([1,2,3]) == false
7
Electric Coffee

ECMAScript 6では、Object.is()は===の拡張です。このメソッドは2つの引数を受け入れ、値が等しい場合はtrueを返します。2つの値が同じタイプで同じ値である場合、2つの値は等しいと見なされます。それは、console.log(Object.is(NaN、NaN))-> TRUEであるためです。

1
SatoK

私はGoogle Apps Scriptを使っているので、ECMA 5にこだわっています。ElectricCoffeeの答えと同様に、値が実際にNaN、値がNaNの場合ではなく、実際にNaN自体の場合:

_function isThisNaN(x)
{ 
    return isNaN(x) && Object.prototype.toString.call(x) === '[object Number]'; 
}
console.log(isThisNaN(NaN)); // true
_

Object.prototype.toString.call(NaN)が_'[object Number]'_に等しいというのは私にとって面白いことです。私の初心者の脳は、NaNは「数字ではない」と言っていますが、悲しいことに、それはそれほど単純ではありません。

編集:私はこの記事で私が終わった方法を言ったはずだと思います。 確かに数字を含まない文字列は数字として扱われないという考えに行きました...まあ、私はこれを見つけました:

_isNaN('a'); // true
isNaN(' '); // false
_

したがって、_' '_は非数値文字列ですが、明らかに数字(_0_)に変換されます。

_console.log(Number(' ')); // 0.0
_

しかしながら...

_console.log( 0  ? true : false); // false
console.log(' ' ? true : false); // true
_

もっと読んだ後、私はそれをもう少しよく理解しますが、初心者のための精神的なクラップスームをすごいです笑

0
Cecell